我正在尝试根据提取到文件的文件来提取网站的响应。网站具有以下形式。
quality:
category:
debug:
image:
我要做的是上传文件,提交表单并提取响应。
我先看一个例子,我认为我成功地完成了上传工作。因为当我执行此操作时,我没有收到任何错误。
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(...) |
解决方案
使用请求库(pip install requests如果使用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请求混淆。