Python:上传文件后刮取数据

时间:2012-07-13 20:59:49

标签: 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="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>

我想要做的是上传文件,提交表单并提取回复。

我从一个例子开始,我想我成功地设法让上传工作。因为当我跑这个时我没有得到任何错误。

import urllib2_file
import urllib2
import request
import lxml.html as lh

data = {'name': 'image',
        'file':  open('/user/mydir/21T03NAPE7L._AA75_.jpg')
       }
urllib2.urlopen('http://localhost/imgdigestertest.html', data)

不幸的是,我没有在这里做一个请求以获得回复。我不确定应该怎么回应。一旦我得到响应,我应该能够通过一些模式匹配来提取数据,我很满意。

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

import requests

url = 'http://somesite.com:61235/imgdigest'
files = {'file': ('21e1LOPiuyL._SL160_AA115_.jpg', 
                  open('/usr/local/21e1LOPiuyL._SL160_AA115_.jpg', 'rb'))}
other_fields = {"quality": "2",
                "category": "1",
                "debug": "0"
               }
headers={'content-type': 'text/html; charset=ISO-8859-1'}

response = requests.post(url, data=other_fields, files=files, headers=headers)

print response.text

现在我收到以下错误:这告诉我某些图像文件无法正确连接。我们必须指定文件类型吗?

Image::Image(...): bufSize = 0.  Can not load image data. Image size = 0.   DigestServiceProvider.hpp::Handle(...) | 

1 个答案:

答案 0 :(得分:2)

使用请求库(pip install requests,如果您使用pip)。

对于他们的例子,请看这里: http://docs.python-requests.org/en/latest/user/quickstart/#post-a-multipart-encoded-file

要将其定制为与您的相同:

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请求相混淆。