无法解码 urlopen 的结果

Can't decode result from urlopen

我在Python3

中有以下代码
import urllib.request
f = urllib.request.urlopen("https://www.okcoin.cn/api/v1/trades.do?since=0")
a = f.read()  # there is data here
print(a.decode())  # error: UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte

我可以在浏览器中获得 https://www.okcoin.cn/api/v1/trades.do?since=0 的可读结果。浏览器确认编码为UTF-8。

我错过了什么? 谢谢

为什么不使用 requests 模块?

import requests
f = requests.get("https://www.okcoin.cn/api/v1/trades.do?since=0")
a = f.text
print(a)

对我来说很好:)

wget下载数据显示数据实际上是 用 gzip 压缩。所以你需要先解压它。有个 gzip 应该有用的模块。

编辑:试试这个。

import urllib.request
import gzip

f = urllib.request.urlopen("https://www.okcoin.cn/api/v1/trades.do?since=0")
a = f.read()  # there is data here

uncompressed = gzip.decompress(a)
print(uncompressed.decode())

正如我在评论@Yuval Pruss 的回答中提到的,requests 模块隐式处理压缩数据,urllib3 也做同样的事情,因为它支持 gzip 和 deflate 编码。这是一个演示:

>>> import urllib3
>>> http = urllib3.PoolManager()
>>> r = http.request("https://www.okcoin.cn/api/v1/trades.do?since=0")
>>> r.headers['content-encoding']
'gzip'
>>>
>>> import json
>>> if r.status == 200:
        json_data = json.loads(r.data.decode('utf-8'))
        print(json_data[0])
{'date_ms': 1489842827000, 'tid': 7368887285, 'date': 1489842827, 'price': '7236.01', 'amount': '1.081', 'type': 'sell'}