请求返回字节,我无法解码它们

Posted

技术标签:

【中文标题】请求返回字节,我无法解码它们【英文标题】:Request returns bytes and I'm failing to decode them 【发布时间】:2015-10-20 21:50:55 【问题描述】:

基本上我向网站发出请求并得到一个字节响应:b'["geonameId:"703448"..........'. 我很困惑,因为虽然它是字节类型,但它非常易于人类阅读,并且看起来像一个 json 列表。我知道响应是在运行r.encoding 时以latin1 编码的,它返回ISO-859-1,我试图对其进行解码,但它只返回一个空字符串。这是我目前所拥有的:

r = response.content
string = r.decode("ISO-8859-1")
print (string)

这是它打印一个空行的地方。 但是,当我运行

len(string)

我得到:回31023 如何在不返回空字符串的情况下解码这些字节?

【问题讨论】:

在 python 2.x 中,b 前缀将导致包含的字符串成为str 类型,您可能已经隐藏了一些编码字符。在 Python 3.x 上,您将收到 bytes 文字。为什么你认为你需要执行任何编码/解码? 因为我需要解析 json,我只是尝试循环遍历它:使用for i in range(len(contents)): print content[i],它只是打印出很多数字。 【参考方案1】:

您是否尝试使用json 模块对其进行解析?

import json
parsed = json.loads(response.content)

【讨论】:

是的,我得到了:JSON object must be str, not 'bytes' 你什么时候做json.loads(response.content.decode('latin1'))? 响应对象中应该有一个标头告诉您它具有什么编码。您应该使用该编解码器对内容进行解码,否则任何不寻常的字符(表情符号、重音符号、一些引号字符……)最终都会出现乱码。查看@salah 的答案 @mzc 请将content.decode 评论直接添加到答案中。 @mzc, decode('latin1') 并不总是有效,如果 content-type 是text/html; charset=UTF-8,它会失败。【参考方案2】:

另一种解决方案是使用response.text,它以unicode形式返回内容

Type:        property
String form: <property object at 0x7f76f8c79db8>
Docstring:  
Content of the response, in unicode.

If Response.encoding is None, encoding will be guessed using
``chardet``.

The encoding of the response content is determined based solely on HTTP
headers, following RFC 2616 to the letter. If you can take advantage of
non-HTTP knowledge to make a better guess at the encoding, you should
set ``r.encoding`` appropriately before accessing this property.

【讨论】:

这比接受的答案要好得多,因为它将使用适当的编码。 是的,这是文档中的建议:docs.python-requests.org/en/master/user/quickstart/…【参考方案3】:

r.textr.content。第一个是字符串,第二个是字节。

你想要

import json

data = json.loads(r.text)

【讨论】:

我有类似的问题,当我使用 r.text 时,它是空的。 那么可能服务器什么都没有返回。 我正在请求网页的源代码/HTML (dockethound.com),当我使用 r.content 时,它会显示出来。

以上是关于请求返回字节,我无法解码它们的主要内容,如果未能解决你的问题,请参考以下文章

UnicodeDecodeError:'utf-8'编解码器无法解码位置1中的字节0x8b:无效的起始字节

'utf8'编解码器在python中解码('utf-8')时无法解码字节0xc3

DBT snowflake utf-8' 编解码器无法解码位置 1031 中的字节 0xa0:无效的起始字节

UnicodeDecodeError:“utf8”编解码器无法解码位置 3131 中的字节 0x80:无效的起始字节

UnicodeDecodeError:“utf-8”编解码器无法解码位置 34 中的字节 0x85:无效的起始字节

编解码器无法在 Python 中解码字节 [重复]