注意:这是Python 3,没有urllib2。此外,我尝试使用json.loads(),我收到此错误:
TypeError: can't use a string pattern on a bytes-like object
如果我使用json.loads()并从响应中删除.read(),我会收到此错误:
TypeError: expected string or buffer
>
import urllib.request
import json
response = urllib.request.urlopen('http://www.reddit.com/r/all/top/.json').read()
jsonResponse = json.load(response)
for child in jsonResponse['data']['children']:
print (child['data']['title'])
不起作用......我不明白为什么。
答案 0 :(得分:58)
试试这个:
jsonResponse = json.loads(response.decode('utf-8'))
答案 1 :(得分:13)
使用json.loads
而非json.load
。
(load
从类似文件的对象加载,loads
来自字符串。所以你也可以省略.read()
调用。)
答案 2 :(得分:2)
我还不熟悉python 3,但看起来像urllib.request.urlopen()。read()返回一个字节对象而不是字符串。
您可能尝试将其提供给StringIO对象,甚至可以执行str(响应)。
答案 3 :(得分:0)
我在python3中遇到了相同的错误{AttributeError:'bytes'对象没有属性'read'}。 稍后无需使用json即可为我工作:
from urllib.request import urlopen
from bs4 import BeautifulSoup
url = 'https://someurl/'
page = urlopen(url)
html = page.read()
soup = BeautifulSoup(html)
print(soup.prettify('latin-1'))