无法解析urlopen的结果

时间:2017-03-18 11:48:42

标签: python urllib

我在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。

我错过了什么? 感谢

3 个答案:

答案 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'}