当抓取动态网页时,使用python mechanize从下拉列表中检索不到值

2024-10-01 00:19:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我对网络抓取完全陌生。我试着按照这个问题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')

但我似乎连下拉列表里的东西都找不到

^{pr2}$

但是当我检查网页上的元素时,很明显第一个下拉列表中有值

<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()没有返回任何内容? 任何建议都将不胜感激。在


Tags: brimportcomhttpvaluewwwfindselect
1条回答
网友
1楼 · 发布于 2024-10-01 00:19:57

正如您在Firefox中查看源代码时所看到的,您要查找的项并不在服务器发送的原始HTML标记中。实际上,它们是在页面加载后由JavaScript添加的。Mechanize不运行JavaScript,因此它看不到这些项;它只看到HTML中的内容。在

顺便说一句,这种完全不必要的JavaScript的使用是现代Web开发中的一个瘟疫,它会让你做一些你想做的事情比他们应该做的要困难得多。(不过,也许这就是他们这么做的原因。)

总之,要从页面中获取这些信息,您需要使用在真正的Web浏览器中实际加载页面的东西,比如Selenium。在

您链接的另一个SO问题是不同的,因为当您从菜单中选择时,目标站点实际上会发送一个httppost,并收到一个全新的HTTP页面。这一页没有这样做。在

相关问题 更多 >