使用Python提交表单时的问题

2 投票
2 回答
1023 浏览
提问于 2025-04-17 18:43

我正在使用urllib和urllib2这两个库来提交一些表单数据。

这是我需要提交的表单:

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

我正在创建一个包含元组的列表,格式是[ (名字, 值), ... ]

因为提交按钮没有名字,所以我不知道该怎么用urllib/urllib2发送这个元素。

当我尝试把这些数据发送到show_bug.cgi时,我收到了一个HTTP404错误。

我对如何提交表单感到困惑,特别是关于提交按钮的部分。到目前为止,我一直认为提交按钮的值和ID不重要,而且这似乎一直对我有效。


这是TamperData捕获的POST请求:

POST参数

2 个回答

3

requests库怎么样呢?

这个库让事情变得更简单,具体可以看看文档,里面讲了怎么发送一个POST请求。

我想你可以这样做:

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)
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,也就是说会把两个 ID 分开写。

如果没有设置 doseq,那么 ('id', 788604), ('id', 793892) 也会得到同样的结果。

撰写回答