我对网络抓取完全不熟悉。我正在尝试按照此问题Web Scraper for dynamic forms in python
中的代码段进行操作我正在使用http://www.goodlifefitness.com/fitness-classes/find-a-class/进行类似的搜索。填写省,市和班级名称,并搜索时间表。
但是我坚持第一步,检索省份列表
#!/usr/bin/env python
import re
import mechanize
from bs4 import BeautifulSoup
br = mechanize.Browser()
br.open('http://www.goodlifefitness.com/fitness-classes/find-a-class/')
br.select_form('aspnetForm')
ctl = br.form.find_control('ctl00$Copy$ddlRegion')
但似乎我甚至无法从下拉列表中获取任何内容
>>> items=ctl.get_items()
>>> items
[<Item name='' id=None selected='selected' contents='' value='' label=''>]
但是当我检查网页上的元素时,显然第一个下拉列表中有值
<select name="ctl00$Copy$ddlRegion" id="ctl00_Copy_ddlRegion" title="Select a Province" class="dropdown" onchange="comboBoxSearch_onChange(this);">
<option value="">Select a Province</option><option value="Alberta">Alberta</option><option value="British Columbia">British Columbia</option><option value="Manitoba">Manitoba</option><option value="New Brunswick">New Brunswick</option><option value="Newfoundland">Newfoundland</option><option value="Nova Scotia">Nova Scotia</option><option value="Ontario">Ontario</option><option value="Saskatchewan">Saskatchewan</option></select>
为什么ctl.get_items()
什么都没有返回?
任何指针都将非常感激。
答案 0 :(得分:0)
正如您所看到的,如果您在Firefox中执行查看源,您要查找的项目不在服务器发送的原始HTML标记中。实际上,它们是在页面加载后通过JavaScript添加的。 Mechanize不运行JavaScript,因此无法查看这些项目;它只能看到HTML中的内容。
顺便说一句,这种完全不必要的JavaScript使用是现代Web开发的一个瘟疫,并使你做的事情比你应该做的更努力。 (但是,也许这就是他们这样做的原因。)
无论如何,要从页面中删除该信息,您需要使用实际加载页面的内容,例如Selenium。
您链接的另一个SO问题是不同的,因为当您从菜单中选择时,目标站点实际上会发送HTTP POST,并且会收到一个全新的HTTP页面。此页面不会这样做。