在迭代所有表单时选择正确的表单

时间:2016-10-01 10:15:07

标签: python mechanize

我想在机械化的多个网站上提交表单。通常我不能完全知道表单名称或表单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

此代码打印两条成功消息,但不是订阅。以下代码适用于提交订阅表单,因为我设置了表单名称:

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()

第一个代码出了什么问题?如何选择两个表格并提交值?可能问题在于表格选择部分:

br.select_form(nr=0)

编辑:我用Wireshark检查了它的POST请求。它似乎填充了第一种形式2次。当我使用nr=0更改nr=1时,它会起作用,因为正确的表单是第二种形式。

2 个答案:

答案 0 :(得分:0)

您的问题是您不能存储正在处理的表格。我只需将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

注意:x += y等于x = x + y

编辑:你也应该修改你的缩进,你不需要按两次标签,一次按下也是有效的!

答案 1 :(得分:0)

一种解决方案是通过将列表表单传递到br.form而不使用br.select_form来选择表单。

test.html的内容:

<html>
<head>
  <title>Stuff</title>
</head>
    <body>

        <form method="POST" >
            <input type="text" name="email">
        </form>
        <form method="POST">
            <input type="text" name="email">
        </form>
        <form method="POST">
            <input type="text" name="notemail">
        </form>

    </body>
</html>

和修改过的python脚本:

import mechanize
import sys

br = mechanize.Browser()
br.open("http://localhost/test.html")

email = "the@email.com"
for form in br.forms():

    br.form = form

    try:
        textctrl = br.form.find_control(name="email")
        textctrl.value = email
        response = br.submit()

        print "Found email input, Submitted", response

    except mechanize.ControlNotFoundError:
        print "No Email control"

    except:
        print "Unexpected error:", sys.exc_info()[0]

这提交表格1和2但不提交3.希望我能正确理解问题。