使用urllib3和json获取烂番茄数据时出错(Python)

8 投票
1 回答
11311 浏览
提问于 2025-04-18 16:27

作为对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())

撰写回答