python - 在迭代所有形式时选择正确的形式

标签 python mechanize

我想使用 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 时,它起作用了,因为正确的形式是第二种形式。

最佳答案

您的问题是您没有存储正在处理的表格。我会简单地将 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

编辑:你也应该修复你的缩进,你不需要按 Tab 键两次,按一次也可以!

关于python - 在迭代所有形式时选择正确的形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39805391/

相关文章:

python - 覆盖二进制文件中的单个字节会使它无法被 objdump 识别?

python - "Out of Memory" Mechanize 错误

python - Twisted chainDeferred, deferred.result is None

python - 'bytes' 对象没有属性 'encode'

Python Mechanize 用变量或提取的文本填充表单

ruby-on-rails - rails : Download by Mechanize custom filename

python - 使用 Python Mechanize 下载文件

android - 有没有类似 mechanize for Android 的工具?

python - 如何按字符串中第二个单词的字母顺序对列表进行排序

python - 使用 cron 运行脚本在 mac 上不起作用