我正在阅读有关请求库的文档,它似乎已经过时或过时了。 我一步一步地尝试了那里显示的所有示例,当我尝试运行以下部分时遇到了问题:
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。
答案 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的旧bytes
,str
接近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已缩短。