POST表单,包含多个提交元素

时间:2012-12-07 21:05:29

标签: python urllib2 urllib

基于在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()

我已经得到了这个工作,但是,在我正在寻找的特定表格上有两个“提交”类型的按钮。 e.g:

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

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

2 个答案:

答案 0 :(得分:2)

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

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

快速参考,以便您可以看到HTML如何完成它所做的所有事情: http://www.w3.org/TR/html401/interact/forms.html#submit-format

答案 1 :(得分:2)

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

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

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

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

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

在您发现每个单独的提交事件后POSTDATA的内容之后,您将知道如何创建要发送的正确字典。此外,请务必确认您正在发布到正确的URL。祝你好运!