【问题标题】:Get all combinations from selenium drop down list without options or select tag从 selenium 下拉列表中获取所有组合,不带选项或选择标签
【发布时间】:2014-09-11 14:53:17
【问题描述】:

我正在为相应的网站使用 Selenium:http://calstate-la.bncollege.com/webapp/wcs/stores/servlet/TBWizardView?catalogId=10001&langId=-1&storeId=30556

我对这个网站的目标是从各自的下拉菜单中获取部门、课程和部分的所有可能组合。我遇到的主要问题是我想不出任何方法来从下拉菜单中获取值。

根据与我类似的其他堆栈溢出问题,他们提到了使用选择标签和选项标签的解决方案。但是,当我查看此页面源时,下拉菜单中没有此类标签。

所以我在尝试从下拉菜单中获取所有组合时需要帮助,但在我的特殊情况下我不知道如何继续。我还想提一下我使用 Python。

【问题讨论】:

  • 这些不是下拉菜单,它们是 AJAX 调用以使数据看起来像一个下拉菜单。如果您检查网页,您会注意到您要查找的所有信息都在列表中,<li> 元素。
  • 那么我怎样才能点击每个列表元素呢?我可以简单地搜索<li> 标签并点击一下吗?
  • 您尝试这样做时发生了什么?从您的原始帖子中,尚不清楚您要完成什么。如果“我对这个网站的目标是获得所有可能的组合......”,那么 Selenium 就大材小用了!你可以直接抓取网站的 HTML(比如wget),然后解析出你想要的信息。
  • 确切地说,我需要将所有组合输入到部门、课程和部分中,然后我需要从那里点击查找材料。一旦我得到生成的 html 页面,我将保存它并使用 BeautifulSoup 解析它。我的最终目标是从网站上获取所有书籍。
  • 如果您只是对网站进行数据挖掘,那么 Selenium 绝对是矫枉过正——耗时太长,而且太脆弱。另外,请记住网站的所有者(假设您没有获得许可)可能会生气!但我离题了。尝试一些东西,当你有东西给我们看的时候回来。拥有 300 多个代表,您一定已经阅读过此内容:stackoverflow.com/help/on-topic ?

标签: python selenium drop-down-menu selenium-webdriver


【解决方案1】:

我实际上已经尝试在这里使用selenium,但由于页面的异步性质和“人工”下拉菜单(here is what I had so far),它确实很快变得非常痛苦。

这是使用requestsBeautifulSoup 的替代方法(根本不需要浏览器)。

这个想法是模拟填充下拉列表的底层请求:

from bs4 import BeautifulSoup
import requests

CATALOG = 10001
STORE = 30556

url = 'http://calstate-la.bncollege.com/webapp/wcs/stores/servlet/TBWizardView?catalogId={catalog}&langId=-1&storeId={store}'.format(catalog=CATALOG,
                                                                                                                                     store=STORE)
xhr_url = 'http://calstate-la.bncollege.com/webapp/wcs/stores/servlet/TextBookProcessDropdownsCmd'
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.94 Safari/537.36'}

session = requests.Session()
response = session.get(url, headers=headers)
soup = BeautifulSoup(response.content)

campus = soup.find('input', attrs={'name': 'campus1'}).get('value')
book_row = soup.find('div', class_='bookRowContainer')

params = {
    'campusId': campus,
    'deptId': '',
    'courseId': '',
    'sectionId': '',
    'storeId': STORE,
    'catalogId': CATALOG,
    'langId': '-1',
    'dropdown': 'term'
}

terms = book_row.select('li.termOption')
for term in terms:
    params['termId'] = term.get('data-optionvalue')
    response = session.post(xhr_url, params=params, headers=headers)
    print response.content

这将以 JSON 格式打印所有术语的所有部门。

2014 年秋季:

[
    {"categoryName":"AAAS","categoryId":"63420700","categoryIdentifier":"670_1_F14_4","title":"AAAS"},
    {"categoryName":"ACCT","categoryId":"63420752","categoryIdentifier":"670_1_F14_5","title":"ACCT"},
    ...
]

2014 年夏季:

[
    {"categoryName":"AAAS","categoryId":"63007512","categoryIdentifier":"670_1_A14_4","title":"AAAS"},
    {"categoryName":"ACCT","categoryId":"63007490","categoryIdentifier":"670_1_A14_5","title":"ACCT"},
    ...
]

CourseSection 部分留作作业。

希望对您有所帮助。

【讨论】:

  • 嘿@alexce,我想使用 selenium 的原因与我的其他帖子相似,我需要获取所有组合,然后单击查找材料以查找给定课程的所有书籍.漂亮的汤和请求中是否支持硒的这个功能?
  • @user2548635 您实际上可以继续使用requestsBeautifulSoup 并模拟图书搜索请求。这绝对是可行的。我还发布了一个链接,指向我为 selenium-approach 提供的代码 - 你也可以尝试调整它。
  • 我一定会检查并努力解决的。感谢您的帮助,如果有任何问题,我会回复您。
  • @user2548635 当然,这是一项有趣的任务。我喜欢这种挑战:)
猜你喜欢
  • 2017-03-14
  • 1970-01-01
  • 2015-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-23
  • 1970-01-01
相关资源
最近更新 更多