在抓取动态网页时,没有使用python mechanize从下拉列表中检索到的值

时间:2016-03-25 21:17:21

标签: python html web-scraping mechanize

我对网络抓取完全不熟悉。我正在尝试按照此问题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()什么都没有返回? 任何指针都将非常感激。

1 个答案:

答案 0 :(得分:0)

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

顺便说一句,这种完全不必要的JavaScript使用是现代Web开发的一个瘟疫,并使你做的事情比你应该做的更努力。 (但是,也许这就是他们这样做的原因。)

无论如何,要从页面中删除该信息,您需要使用实际加载页面的内容,例如Selenium。

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