1

基于在 SO 和其他来源上找到的一些快速示例,我正在尝试使用 Python urllib/urllib2 通过以下方式提交表单:

>>> import urllib, urllib2
>>> url = 'http://example.com'
>>> r_params = {'a':'test','b':'hooray'}
>>> e_params = urllib.urlencode(r_params)
>>> user_agent = 'some browser and such'
>>> headers = {'User-Agent': user_agent}
>>> req = urllib2.Request(url, e_params, headers)
>>> response = urllib2.urlopen(req)
>>> data = response.read()

我已经让这个工作了,但是,在我正在寻找的特定表单上,有两个“提交”类型的按钮。例如:

<b><input type="submit" name="ButtonA" value="SUBMIT"></b>
<b><input type="submit" name="ButtonB" value="LINK"></b>

我相信我遇到的问题是由于当前代码选择了错误的代码。如何通过提交 ButtonB 而不是 ButtonA 来获得响应?我读过的一些东西似乎表明我可以尝试使用 mechanize,但我希望保持简单,而无需阅读和学习 mechanize。有没有一种简单的方法可以做到这一点,或者我需要接受它并真正花时间学习和理解我在做什么?

4

2 回答 2

2

如果是这样的话,它应该相当简单——你应该看看你到底在做什么。具体来说,您正在发送一个 POST 请求(如果提供了 data 参数,urllib2.urlopen 将自动发送一个 POST 请求),其中的数据通常由表单元素本身提供。在多个“提交”输入的情况下,激活的提交输入的名称和值与其余的表单数据一起发送。

所以,这就是你所要做的 - 包括 "ButtonB":"LINK" 作为数据。

快速参考,以便您了解 HTML 如何完成所有功能: http: //www.w3.org/TR/html401/interact/forms.html#submit-format

于 2012-12-07T21:21:24.367 回答
2

我建议使用像TamperData for Firefox 这样的工具来准确地发现站点的 POST 是如何形成的。在您准备好单击其中一个按钮之前激活 TamperData。当它启动时,继续并单击一个。POST 将记录在 TamperData 中。找到它并单击它。

找到下面的 POSTDATA 行并双击它。选择“已解码”单选按钮以删除 HTML 转义。现在,您在制作“r_params”字典时应该复制 1:1 参考。例如,如果 POSTDATA 看起来像这样:

Name        | Value
--------------------
QueryString | test
Page        |
Search      | blah

然后你会像这样创建你的字典:

r_params = {'QueryString': 'test',
            'Page': '',
            'Search':, 'blah'}

在您了解每个单独的提交事件的 POSTDATA 是什么样子之后,您将知道如何创建正确的字典来发送。此外,请务必确认您发布到正确的 URL。祝你好运!

于 2012-12-07T21:25:46.917 回答