我想用机械化在多个网站上提交表单.通常我不能确切地知道表单名称或表单ID,但我知道我想要提交的输入名称.
假设有一个网站里面有几种形式.我的代码应该检查所有表单,如果其中一个表单有一个名为"email"的输入值,它将提交该表单.如果有多个表单,它将全部提交.
我正在测试的网站有两种形式.其中一个是登录表单,另一个是订阅表单.它们都有"电子邮件"输入值.所以我的代码应该提交两个表单.
我正在尝试使用此代码块实现它:
for forms in br.forms():
if not forms.find_control(name="email"):
continue
br.select_form(nr=0)
br.form["email"] = email
br.submit()
print "Success: ", link
Run Code Online (Sandbox Code Playgroud)
此代码打印两条成功消息,但不是订阅.以下代码适用于提交订阅表单,因为我设置了表单名称:
br = mechanize.Browser()
br.set_handle_robots(False)
br.addheaders = [('User-agent', 'Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.6')]
br.open("http://example.com")
br.select_form("subscribe")
br.form["email"] = email
br.submit()
Run Code Online (Sandbox Code Playgroud)
那么第一个代码有什么问题?如何选择两个表格并提交值?可能问题在于表格选择部分:
br.select_form(nr=0)
Run Code Online (Sandbox Code Playgroud)
编辑:我用Wireshark检查了它的POST请求.它似乎填充了第一种形式2次.当我改变nr=0与nr=1它的工作原理,因为正确的形式是第二种形式.
您的问题是您没有存储您正在处理的表单。我只需将 0 分配给一个变量,并在每次迭代后添加 1。所以你的代码应该是:
currentForm = 0
for form in br.forms():
if not forms.find_control(name = "email"):
currentForm += 1
continue
print "Selecting form number %i..." % currentForm
br.select_form(nr = currentForm)
br.form["email"] = email
br.submit()
currentForm += 1
print "Success: ", link
Run Code Online (Sandbox Code Playgroud)
注:x += y等于x = x + y
编辑:您也应该修复缩进,不需要按两次 Tab 键,按一次也可以!