无法解码 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'}
我在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'}