Python:上传文件后刮取数据

Python:上传文件后刮取数据,python,post,file-upload,request,urllib,Python,Post,File Upload,Request,Urllib,我试图上传一个基于上传到文件的文件的站点响应的摘录。网站有以下形式 <html> <head> <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> </head> <body> <form method="POST" action="http://somewebsite.com/imgdigest" enctype="m

我试图上传一个基于上传到文件的文件的站点响应的摘录。网站有以下形式

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
  </head>
  <body>
     <form method="POST" action="http://somewebsite.com/imgdigest" enctype="multipart/form-data">
        quality:<input type="text" name="quality" value="2"><br>
        category:<input type="text" name="category" value="1"><br>
        debug:<input type="text" name="debug" value="1"><br>
        image:<input type="file" name="image"><br>
        <input type="submit" value="Submit">
     </form>
  </body>
</html>
不幸的是,我没有在这里请求回复。我不知道我该如何回答。一旦我得到响应,我应该能够提取一些模式匹配的数据,这让我感到很舒服

根据提供的答案,尝试以下代码:

现在,我得到了以下错误:这告诉我,一些图像文件没有得到正确的附加。我们必须指定文件类型吗

Image::Image(...): bufSize = 0.  Can not load image data. Image size = 0.   DigestServiceProvider.hpp::Handle(...) | 
使用请求库(
pip安装请求
,如果使用pip)

有关其示例,请参见此处:

要将其定制为与您的一样,请执行以下操作:

import requests
url = 'http://localhost:8080/test_meth'
files = {'file': ('21T03NAPE7L._AA75_.jpg', 
                  open('./text.data', 'rb'))}
other_fields = {"quality": "2",
                "category": "1",
                "debug": "1"
               }
response = requests.post(url, data=other_fields, files=files)
print response.text
在我的本地系统上,text.data包含以下内容:

Data in a test file.
我用cherrypy(pip install cherrypy)编写了一个server.py来测试我上面给出的客户机。以下是server.py的源代码:

import cherrypy
class Hello(object):
    def test_meth(self, category, debug, quality, file):
        print "Form values:", category, debug, quality
        print "File name:", file.filename
        print "File data:", file.file.read()
        return "More stuff."
    test_meth.exposed = True
cherrypy.quickstart(Hello())
当我运行上述client.py时,它会打印:

More stuff.
正如您在server.py示例中所看到的,这就是返回的内容

同时,服务器说:

Form values: 1 1 2
File name: 21T03NAPE7L._AA75_.jpg
File data: Data in a test file.

127.0.0.1 - - [14/Jul/2012:00:00:35] "POST /test_meth HTTP/1.1" 200 11 "" "python-requests/0.13.3 CPython/2.7.3 Linux/3.2.0-26-generic"
因此,您可以看到客户机正在发布代码中描述的文件名以及指定本地文件的文件内容


需要指出的一点是,在这篇文章的开头,我说要使用请求库。这不能与您在原始问题中导入的urllib请求混淆。

urllib2.urlopen(“”,data).read()返回什么?我得到了与我发布的相同的html,我尝试了以下答案,结果是相同的data2=urllib.urlencode(data)req=urllib2.request(url,data2)是吗?所以在运行这个代码之前我需要urllib…?啊,所以你想把img传递到另一个站点。该站点应该如何响应?在文件字典中,您编写了文件名字符串,该字符串应该是字段的名称,而不是“21T03NAPE7L.\u AA75.\u.jpg”是什么原因导致我得到与结果相同的html。我不确定您所得到的html是什么意思。如果response.text与您获得的原始HTML表单相同,则表示服务器返回的表单与对帖子的响应相同。是的,我在打印response.text时获得的表单数据相同。我没有上载21T03NAPE7L.\u AA75.\u.jpg和文本文件,我上传了一个文本文件,并且说我上传的文件名是21T03NAPE7L._AA75_u75.jpg,这是完全有效的。事实上,您正在使用表单的本地缓存版本很可能会导致问题。如果我这样做,我将以交互方式使用python,并将请求库直接指向真实的web站点。如果这不是秘密,你可以分享真实的网站。
More stuff.
Form values: 1 1 2
File name: 21T03NAPE7L._AA75_.jpg
File data: Data in a test file.

127.0.0.1 - - [14/Jul/2012:00:00:35] "POST /test_meth HTTP/1.1" 200 11 "" "python-requests/0.13.3 CPython/2.7.3 Linux/3.2.0-26-generic"