从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




