使用 python 抓取动态网页时没有从下拉列表中检索到任何值
No value retrieved from dropdown list with python mechanize when scraping a dynamic webpage
我对网络抓取完全陌生。我正在尝试按照此问题
中找到的代码片段进行操作
我正在使用 http://www.goodlifefitness.com/fitness-classes/find-a-class/ 进行类似的搜索。填写省、市和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()
没有返回任何内容?
任何指针将不胜感激。
正如您在 Firefox 中查看源代码时所看到的,您要查找的项目不在服务器发送的原始 HTML 标记中。事实上,它们是在页面加载后通过 JavaScript 添加的。 Mechanize 没有 运行 JavaScript,所以它看不到那些项目;它只看到 HTML.
中的内容
顺便说一句,JavaScript 的这种完全不必要的使用是现代 Web 开发中的一个瘟疫,并且使得像您尝试做的事情比他们应该做的更难。 (但是,也许这就是他们这样做的原因。)
无论如何,要从页面中抓取该信息,您需要使用能够在真实 Web 浏览器中实际加载页面的工具,例如 Selenium。
您链接的另一个 SO 问题不同,因为当您从菜单 select 时,目标站点实际上会发送一个 HTTP POST,并收到一个全新的 HTTP 页面。此页面不执行此操作。
我对网络抓取完全陌生。我正在尝试按照此问题
我正在使用 http://www.goodlifefitness.com/fitness-classes/find-a-class/ 进行类似的搜索。填写省、市和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()
没有返回任何内容?
任何指针将不胜感激。
正如您在 Firefox 中查看源代码时所看到的,您要查找的项目不在服务器发送的原始 HTML 标记中。事实上,它们是在页面加载后通过 JavaScript 添加的。 Mechanize 没有 运行 JavaScript,所以它看不到那些项目;它只看到 HTML.
中的内容顺便说一句,JavaScript 的这种完全不必要的使用是现代 Web 开发中的一个瘟疫,并且使得像您尝试做的事情比他们应该做的更难。 (但是,也许这就是他们这样做的原因。)
无论如何,要从页面中抓取该信息,您需要使用能够在真实 Web 浏览器中实际加载页面的工具,例如 Selenium。
您链接的另一个 SO 问题不同,因为当您从菜单 select 时,目标站点实际上会发送一个 HTTP POST,并收到一个全新的 HTTP 页面。此页面不执行此操作。