在Python中尝试发送多部分表单数据,但无法发送

4 投票
2 回答
10082 浏览
提问于 2025-04-16 22:23

我对Python还比较陌生,所以如果我漏掉了什么简单的东西,先说声抱歉。我正在尝试在Python中向一个多部分表单发送数据。脚本可以运行,但就是不发送数据。我不太确定自己哪里出错了。

import urllib, urllib2
from poster.encode import multipart_encode
from poster.streaminghttp import register_openers

def toqueXF():
    register_openers()
    url = "http://localhost/trunk/admin/new.php"
    values = {'form':open('/test.pdf'),
              'bandingxml':open('/banding.xml'),
              'desc':'description'}
    data, headers = multipart_encode(values)
    request = urllib2.Request(url, data, headers)
    response = urllib2.urlopen(request)
    the_page = response.read()
    print the_page

当我调用这个时,打印出来的内容是网页的HTML,就像我运行了“urllib2.urlopen(url)”但没有发送任何数据一样:

<form enctype="multipart/form-data" action="" method="post">
    <p><input type="hidden" name="MAX_FILE_SIZE" value="1000000000" /></p>
    <p>Select PDF file to create form from: <input name="form" type="file" /></p>
    <p>(Optional): Select banding XML file: <input name="bandingxml" type="file" /></p>
    <p>Enter description of form: <input name="desc" type="text"/><br/></p>
    <p><input type="submit" value="Upload form" /></p>
</form>

poster是用来将数据编码为multipart/form数据的,详细信息可以在这里找到:http://atlee.ca/software/poster/index.html

我在这里找到了使用poster的代码:使用MultipartPostHandler在Python中发送表单数据

如果有人感兴趣,我正在尝试在生成pdf和xml文件后自动发送它们,这些文件是为queXF(一个开源的光学标记识别软件)生成的。http://quexf.sourceforge.net/

2 个回答

-2

试试使用requests这个库。关于如何上传多部分文件的文档可以在这里找到:http://docs.python-requests.org/en/latest/user/quickstart/#post-a-multipart-encoded-file

1
import urllib, urllib2
from poster.encode import multipart_encode
from poster.streaminghttp import register_openers

def queXF():
    register_openers()
    url = "http://lilix2/trunk/admin/new.php"
    values = {'form':open('test.pdf'),
          'bandingxml':open('banding.xml'),
          'desc':'description'}
    data, headers = multipart_encode(values)
    headers['User-Agent'] = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
    request = urllib2.Request(url, data, headers)
    request.unverifiable = True
    response = urllib2.urlopen(request)
    the_page = response.read()

添加了 headers['User-Agent']request.unverifiable = True 之后,问题好像解决了。

撰写回答