二进制响应内容,请求lib

时间:2016-03-17 16:01:23

标签: python

我正在阅读有关请求库的文档,它似乎已经过时或过时了。 我一步一步地尝试了那里显示的所有示例,当我尝试运行以下部分时遇到了问题:

import requests
from PIL import Image
from StringIO import StringIO

response = requests.get('http://www.github.com')
i = Image.open(StringIO(response.content))

这篇文章来自官方文档。我得到的第一个错误是ImportError:没有名为StringIO的模块

好的,然后我发现该模块不再存在,并且为了导入StringIO,必须编写from io import StringIO。我做到了尝试再次运行代码,这次它出现错误" TypeError:initial_value必须是str或None,而不是字节"。 我究竟做错了什么?我没有跟随......我所做的只是尝试运行官方文档中的代码......我一无所知。

EDITED: 是的...使用PIL必须安装Pillow。

2 个答案:

答案 0 :(得分:3)

从你说的,你运行python3(因为StringIO包已经在python3中重命名为io,而不是python2),你的例子是python2(原因很明显)。 / p>

所以对你的问题:

"TypeError:initial_value must be str or None, not bytes".

这意味着:

response = requests.get('http://www.github.com')

您要None获取bytes,或response.content获得response.content的回复。鉴于您的请求有效,并且您可以访问bytes,它很可能位于requests

由于str库工作在一个相当低的级别,所有进入和插入套接字(包括HTTP套接字)的数据都是纯二进制的(即不解释),以便能够在字符串中使用输出您需要将其转换为某些功能。

在python3中unicode是来自python2的旧bytesstr接近python2的旧StringIO。所以 需要将字节转换为字符串以提供i = Image.open(StringIO(response.content.decode('utf-8')))

Image.open()
例如,

。但是后来我期待Image.open()对你大吼大叫它不知道wtf应该用unicode缓冲区,它真正想要的只是一个字节数组!

但是因为BytesIO实际上是期望一个字节流而不是unicode流,所以 要做的事实上是使用StringIO而不是{{} 1}}:

from io import BytesIO
i = Image.open(BytesIO(response.content))

最后,您可以举一个例子,但它并不适用,因为您提供了指向HTML网页的链接,而不是图片。

HTH

答案 1 :(得分:0)

如果想要解析图像,实际从互联网上获取图像是个好主意:D(与在github.com上获取索引页面相反)

import requests
from PIL import Image
from StringIO import StringIO

url = "https://upload.wikimedia.org/wikipedia/commons/thumb/4/46/Venn0110.svg/576px-Venn0110.svg.png"
response = requests.get(url)
i = Image.open(StringIO(response.content))

您尝试使用的示例与您在此处发布的内容有所不同:

3.3.4 Binary Response Content
You can also access the response body as bytes, for non-text requests:
>>> r.content
b'[{"repository":{"open_issues":0,"url":"https://github.com/...
The gzip and deflate transfer-encodings are automatically decoded for you.
For example, to create an image from binary data returned by a request, you can use the following code:
>>> from PIL import Image
>>> from StringIO import StringIO
>>> i = Image.open(StringIO(r.content))

https://github.com/...< - 这三个点(省略号)表示该示例中的URL已缩短。

来源:Requests Documentation Release 2.9.1