我在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。
我错过了什么? 感谢
答案 0 :(得分:2)
为什么不使用requests
模块?
import requests
f = requests.get("https://www.okcoin.cn/api/v1/trades.do?since=0")
a = f.text
print(a)
适合我的工作:)
答案 1 :(得分:2)
使用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())
答案 2 :(得分:0)
正如我在评论中提到的@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'}