gpt4 book ai didi

python - 二进制响应内容,请求库

转载 作者:行者123 更新时间:2023-12-02 08:06:36 25 4
gpt4 key购买 nike

我正在阅读有关请求库的文档,它似乎已经非常过时了。

我一步一步尝试了其中显示的所有示例,并在尝试运行以下代码时遇到了问题:

import requests
from PIL import Image
from StringIO import StringIO

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

那篇文章来自官方文档。我遇到的第一个错误是 ImportError: no module named StringIO

好吧,然后我发现该模块不再存在,为了导入 StringIO,必须编写 from io import StringIO。我就是这么做的。尝试再次运行代码,这次出现错误:TypeError:initial_value must be str or None, not bytes。我到底做错了什么?我不明白...我所做的只是尝试运行官方文档中的代码...我一无所知。

编辑:是的...要使用 PIL,必须安装 Pillow。

最佳答案

根据你的说法,你正在运行 python3 (因为 StringIO 包已在 python3 中重命名为 io ,而不是 python2),并且你的示例是 python2 (很明显原因)。

对于您的问题:

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

这意味着:

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

您要么得到 None,要么得到 response.contentbytes 响应。鉴于您的请求有效,并且您可以访问 response.content,它很可能以字节为单位。

由于 requests 库在相当低的级别上工作,并且传入和传到套接字(包括 HTTP 套接字)的所有数据都是纯二进制(即未解释),因此能够使用字符串函数中的输出,您需要将其转换为某种东西。

在Python3中,str是Python2中旧的unicode,而bytes接近旧的str python 2。因此,您需要将字节转换为字符串以提供StringIO:

i = Image.open(StringIO(response.content.decode('utf-8')))
例如。但是我期待 Image.open() 会对你大喊大叫,它不知道它应该如何处理 unicode 缓冲区,它真正想要的只是一个字节数组!

但是因为 Image.open() 实际上需要一个字节流,而不是 unicode 流,所以您应该实际上要做的是使用 BytesIO 而不是 StringIO:

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

最后,您很乐意举一个例子,但这不是一个可行的例子,因为您提供的是 HTML 页面而不是图像的链接。

HTH

关于python - 二进制响应内容,请求库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36065792/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com