我正在尝试填写该网站的表格http://www.marutisuzuki.com/Maruti-Price.aspx.
它由三个下拉列表组成。一是汽车型号,二是州,三是城市。前两个是静态的,第三个城市是根据州的值动态生成的,有一个 onclick java 脚本事件正在运行,它获取州中相应城市的值。
我熟悉Python中的mechanize模块。我发现几个链接告诉我我无法处理动态内容在机械化。但是这个链接http://toddhayton.com/2014/12/08/form-handling-with-mechanize-and-beautifulsoup/在“动态添加项目” 指出我可以使用 mechanize 来处理动态内容,但我不明白其中的这行代码
item = Item(br.form.find_control(name='searchAuxCountryID'),{'contents': '3', 'value': '3', 'label': 3})
这行代码对应表单中城市字段的“Item”是什么。我遇到了 selenium 模块,它可能会帮助我处理动态下拉列表。但我无法在其文档或任何关于如何使用它的好博客中找到任何内容。
有人可以建议我如何针对不同的型号、州和城市提交此表格吗?任何有关如何解决此问题的链接将不胜感激。有关如何提交表单的 Python 示例代码将会很有帮助。提前致谢。
如果您在开发人员工具中查看发送到该站点的请求,您将看到在您选择状态后就会立即发送 POST。发回的响应的表单中填充了城市下拉列表中的值。
因此,要在脚本中复制此内容,您需要类似以下内容:
- 打开页面
- 选择表格
- 选择模型和状态的值
- 提交表格
- 从发回的回复中选择表格
- 选择城市值(现在应该已填充)
- 提交表格
- 解析结果表的响应
那看起来像:
#!/usr/bin/env python
import re
import mechanize
from bs4 import BeautifulSoup
def select_form(form):
return form.attrs.get('id', None) == 'form1'
def get_state_items(browser):
browser.select_form(predicate=select_form)
ctl = browser.form.find_control('ctl00$ContentPlaceHolder1$ddlState')
state_items = ctl.get_items()
return state_items[1:]
def get_city_items(browser):
browser.select_form(predicate=select_form)
ctl = browser.form.find_control('ctl00$ContentPlaceHolder1$ddlCity')
city_items = ctl.get_items()
return city_items[1:]
br = mechanize.Browser()
br.open('http://www.marutisuzuki.com/Maruti-Price.aspx')
br.select_form(predicate=select_form)
br.form['ctl00$ContentPlaceHolder1$ddlmodel'] = ['AK'] # model = Maruti Suzuki Alto K10
for state in get_state_items(br):
# 1 - Submit form for state.name to get cities for this state
br.select_form(predicate=select_form)
br.form['ctl00$ContentPlaceHolder1$ddlState'] = [ state.name ]
br.submit()
# 2 - Now the city dropdown is filled for state.name
for city in get_city_items(br):
br.select_form(predicate=select_form)
br.form['ctl00$ContentPlaceHolder1$ddlCity'] = [ city.name ]
br.submit()
s = BeautifulSoup(br.response().read())
t = s.find('table', id='ContentPlaceHolder1_dtDealer')
r = re.compile(r'^ContentPlaceHolder1_dtDealer_lblName_\d+$')
header_printed = False
for p in t.findAll('span', id=r):
tr = p.findParent('tr')
td = tr.findAll('td')
if header_printed is False:
str = '%s, %s' % (city.attrs['label'], state.attrs['label'])
print str
print '-' * len(str)
header_printed = True
print ' '.join(['%s' % x.text.strip() for x in td])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)