使用urllib3和json获取烂番茄数据时出错(Python)
作为对API的介绍,我正在尝试使用Rotten Tomatoes的API在Python中获取数据。这也是我第一次接触json。
我使用的是Python 3.4,并且确认已经安装了json和urllib3这两个库。
这是我的代码:
import urllib3
import json
url = 'http://api.rottentomatoes.com/api/public/v1.0/lists/movies/box_office.json?limit=16&country=us&apikey=API-KEY';
http = urllib3.PoolManager()
request = http.request('GET', url)
print (json.load(request));
request.release_conn()
这是我遇到的错误:
Traceback (most recent call last):
File "C:\Users\admnasst1\Documents\Personal\Python\RotTomTest.py", line 16, in <module>
print (str(json.load(request)));
File "C:\Python34\lib\json\__init__.py", line 268, in load
parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
File "C:\Python34\lib\json\__init__.py", line 312, in loads
s.__class__.__name__))
TypeError: the JSON object must be str, not 'bytes'
因为我正在尝试很多新东西(API、urllib3、json),所以我不太确定发生了什么。我试过几种不同的代码版本,但总是出现同样的错误,所以我觉得我一定是漏掉了什么基本的东西……你们能帮我找出来吗?
1 个回答
16
你需要把网络数据解码成字符串:
json.loads(request.data.decode('utf8'))
理想情况下,你应该从 Content-Type
头信息中判断使用了什么编码;然后解析这个信息,找出 charset=
参数。对于 JSON 数据,默认的编码方式是 UTF-8。
如果你打算使用第三方库,建议使用 requests
。这个库把 urllib3
包装成了一个更友好的接口,并且可以帮你处理 JSON 数据:
import requests
url = 'http://api.rottentomatoes.com/api/public/v1.0/lists/movies/box_office.json'
params = {'limit': 16, 'country': 'us', 'apikey': 'API-KEY'}
response = requests.get(url, params=params)
print(response.json())