You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

从Stackoverflow API获取JSON时遇UTF-8解码错误,求解决方案

解决Stackoverflow API JSON解码失败的问题

你碰到的这个UnicodeDecodeError其实很好解决——Stack Exchange API返回的响应是gzip压缩格式的,直接拿utf-8去解码压缩后的字节流肯定会出错,报错里的0x8b就是gzip压缩数据的标志性起始字节哦。

另外还要注意你代码里的URL参数,&是HTML的转义字符,直接用在Python的URL字符串里会导致参数解析错误,得改成普通的&

下面是修正后的完整代码,加入了解压步骤:

import urllib.request
import gzip

# 修正URL里的转义字符,把&改成&
url = "https://api.stackexchange.com/2.2/questions?order=desc&sort=activity&site=stackoverflow"
fp = urllib.request.urlopen(url)
# 先对返回的字节流进行gzip解压
compressed_bytes = fp.read()
uncompressed_bytes = gzip.decompress(compressed_bytes)
# 再用utf-8解码成字符串
mystr = uncompressed_bytes.decode("utf8")
fp.close()
print(mystr)

如果想更优雅一点,还可以让请求自动处理压缩,通过添加请求头告诉服务器我们支持gzip,然后根据响应头判断是否需要解压:

import urllib.request
import gzip

url = "https://api.stackexchange.com/2.2/questions?order=desc&sort=activity&site=stackoverflow"
# 添加请求头,声明接受gzip压缩的响应
req = urllib.request.Request(url, headers={"Accept-Encoding": "gzip"})

with urllib.request.urlopen(req) as response:
    # 根据响应头判断是否需要解压
    if response.info().get("Content-Encoding") == "gzip":
        content = gzip.decompress(response.read())
    else:
        content = response.read()
    mystr = content.decode("utf8")
    print(mystr)

这样就能正常拿到解析后的JSON字符串啦!

内容的提问来源于stack exchange,提问作者ceth

火山引擎 最新活动