使用python发布表单的问题

时间:2013-03-11 19:46:21

标签: python http post urllib2 urllib

我正在使用urllib,urllib2的组合来POST一些表单数据。

以下是我需要提交的表单

<form method="post" action="show_bug.cgi">
            <input type="hidden" name="ctype" value="xml">
            <input type="hidden" name="id" value="788604">
            <input type="hidden" name="id" value="793892">
            <input type="hidden" name="id" value="823569">
            <input type="hidden" name="id" value="823585">
            <input type="hidden" name="id" value="825904">
            <input type="hidden" name="id" value="827493">
            <input type="hidden" name="excludefield" value="attachmentdata">
            <input type="submit" value="XML" id="xml">
</form>

我正在创建[ (name,value), ... ]

形式的元组列表

由于提交类型元素没有名称,我不知道如何以及是否使用urllib / urllib2发送该元素。

当我尝试将此数据发布到show_bug.cgi时,我收到HTTP404错误。

我对如何POST表单感到困惑,尤其是提交输入类型。到目前为止,我一直认为提交类型的值和ID从不重要,到目前为止它似乎对我有用。


这是TamperData

捕获的帖子请求

POST parameters

2 个答案:

答案 0 :(得分:3)

以下请求有效:

from urllib import urlencode
from urllib2 import urlopen


url = 'https://bugzilla.mozilla.org/show_bug.cgi'
data = urlencode([('ctype', 'xml'), ('id', [788604, 793892]),
                  ('excludefield', 'attachmentdata'),
                  ], doseq=True)
response = urlopen(url, data)
print(response.code) # -> 200
xml = response.read()

如果doseq=True,则('id', [788604, 793892])被编码为id=788604&id=793892

如果没有doseq('id', 788604), ('id', 793892)会产生相同的结果。

答案 1 :(得分:3)

requests库怎么样?

它使事情变得更简单,请参阅docs了解如何发布帖子请求。

我猜你应该像这样做:

import requests

host = "my_host/"
url = host + "show_bug.cgi"

params = {'ctype': 'xml', 
          'excludefield': 'attachmentdata',
          'id': [788604,...,827493],
          'xml': 'XML'}
response = requests.post(url, data=params)