昨天,我试图从this webpage(西班牙马德里几家医院等候名单上的人数界面)中搜索数据。表格非常简单:一个选择医院,然后填写不同的服务(皮肤病学,内分泌学等)和日期(目前只有2016年12月)。
我正在阅读HTML代码并尝试编写一个非常简单的Python脚本来完成自动下载所有数据的任务。完整代码是in this github repository,但我将逐步介绍它。
首先,我加载页面并获取对主窗体的引用:
import mechanize
# Config vars
URL = "https://servicioselectronicos.sanidadmadrid.org/LEQ/Consulta.aspx"
if __name__ == "__main__":
br = mechanize.Browser()
br.open(URL)
response = br.response()
br.select_form('aspnetForm')
form = br.form
此时,form
包含对文档中主窗体的引用。然后我选择列表中的第二个医院(可能是任何一个)并提交它(原始代码执行_doPostBack
以填写其余的下拉项目):
# Select the second hospital and re-submit in order to have the list of
# services available in that hospital
form.controls[2].items[1].selected = True
request = br.submit()
# We can now submit with the desired selection
br.select_form('aspnetForm')
form = br.form
现在,form
是对填写表单的引用,包含该特定医院可用的服务列表和日期。然后我选择其中几个字段并重新提交:
form.controls[2].items[1].selected = True
form.controls[3].items[1].selected = True
form.controls[4].items[0].selected = True
req_data = form.click_request_data()
response = br.submit()
然而,这是我真的很困惑,response
不包含所需的结果(等待名单中的人数)。 HTML代码仅包含填写的表单,其中包含我选择的值,但没有其他内容。
我知道这可以废弃。我已经看到另一个用R编写的解决方案,它使用selenium作为浏览器引擎。我是否遗漏了某些东西,或者这个特殊的例子是不能简单地使用mechanize
来删除的东西,但是某种程度上需要更复杂的东西?