2017-03-18 51 views
0

我在Python3无法从的urlopen

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。

我错过了什么? 感谢

回答

2

为什么不使用requests模块?

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

工作正常,我:)

+2

'requests'库自动处理压缩的数据,请参见本[常见问题](http://www.python-requests.org/en/latest/community/faq/#encoded-data ) –

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()) 
+0

谢谢!这个答案更具信息性,但@YuvalPruss提供了一个更实用的解决方案(更简单) – ultrahamster

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