我使用的巴士公司运营着一个糟糕的网站(希伯来语、英语),它制作了一个简单的“今天从 A 到 B 的时间表”查询一场噩梦。我怀疑他们试图鼓励使用昂贵的 SMS 查询系统。
我正在尝试从站点获取整个时间表,方法是将每个可能点的查询提交到每个可能的点,总计大约 10k 个查询。查询结果出现在弹出窗口中。我对网络编程很陌生,但熟悉 python 的基本方面。
- 解析页面,从下拉菜单中选择一个值,然后使用脚本按“提交”的最优雅的方式是什么?
- 如何为程序提供新弹出窗口的内容作为输入?
谢谢!
Twill是一种用于 Web 浏览的简单脚本语言。它碰巧有一个python api。
斜纹布本质上是 mechanize 包装周围的薄壳。所有斜纹命令都在 commands.py 文件中实现,pyparsing 完成解析输入并将其转换为 Python 命令的工作(参见 parse.py)。交互式 shell 工作和 readline 支持是通过 cmd 模块(来自标准 Python 库)实现的。
从上述链接文档中“按下”提交的示例:
from twill.commands import go, showforms, formclear, fv, submit
go('http://issola.caltech.edu/~t/qwsgi/qwsgi-demo.cgi/')
go('./widgets')
showforms()
formclear('1')
fv("1", "name", "test")
fv("1", "password", "testpass")
fv("1", "confirm", "yes")
showforms()
submit('0')
我建议你使用mechanize。这是他们页面中的代码片段,显示了如何提交表单:
import re
from mechanize import Browser
br = Browser()
br.open("http://www.example.com/")
# follow second link with element text matching regular expression
response1 = br.follow_link(text_regex=r"cheese\s*shop", nr=1)
assert br.viewing_html()
print br.title()
print response1.geturl()
print response1.info() # headers
print response1.read() # body
response1.close() # (shown for clarity; in fact Browser does this for you)
br.select_form(name="order")
# Browser passes through unknown attributes (including methods)
# to the selected HTMLForm (from ClientForm).
br["cheeses"] = ["mozzarella", "caerphilly"] # (the method here is __setitem__)
response2 = br.submit() # submit current form
# print currently selected form (don't call .submit() on this, use br.submit())
print br.form
您很少想要真正“按下提交按钮”,而不是直接向处理程序资源发出 GET 或 POST 请求。查看表单所在的 HTML,并查看它提交到哪个 URL 的哪些参数,以及它是 GET 还是 POST 方法。您可以使用 urllib(2) 轻松地形成这些请求。