使用隐藏表单时如何克服ItemsNotFoundError机械化

时间:2019-05-08 20:50:05

标签: python web web-scraping mechanize-python

我正在创建一个提交表单的脚本。我面临的问题是,某些选项是隐藏的,并且在填充其他字段之前不会显示选项(在HTML源代码中)。

我得到的错误是ItemNotFoundError:名称为“ xxx”的项目不足。

我尝试按“正确的顺序”更改字段,但是按预期,这不会更改结果。

我的代码如下:

import mechanize

br = mechanize.Browser()
br.set_handle_robots(False) #ignore robots.txt
br.addheaders = [('User-agent', 'Mozilla/5.0 (Windows NT 5.2; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11')]

bot = br.open("www.website.com")
br.select_form(nr=0)

br['type'] = ["xxx",]
br['specific'] = ["yyy",]

如前所述,问题是“类型”和“特定”具有一对多关系,并且两者都是下拉选择字段。选择“类型”时,将出现“特定”的不同选项。

当您首次查看网站的页面源时,“特定”的唯一选项是-1。如果确实为“类型”选择了某些内容,则“特定”将出现多个选项,但是机械化看不到这些选项。相反,我可以在页面源代码中查看它们。

当我通过br.submit()提交表单时,出现ItemsNotFoundError,因为它看不到这些值。有办法克服这个问题吗?

我已经尝试解决了好几个小时,所以如果有人可以帮助我,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的方法。希望这可以帮助面临类似问题的其他人。我要做的就是添加:

item = mechanize.Item(br.form.find_control(name='nameOfFormControl'),
           {'contents': '221', 'value': '221', 'label': 221})

基本上,我在表单控制组中添加了新选项(我知道这是有效的)。