我正在尝试根据上传到文件的文件上传提取网站的响应。网站具有以下形式。
<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(...) |
答案 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请求相混淆。