Note: Ceci est Python 3, il n'y a pas urllib2. De plus, j'ai essayé d'utiliser json.loads () et j'obtiens cette erreur:
TypeError: can't use a string pattern on a bytes-like object
J'obtiens cette erreur si j'utilise json.loads () et que je supprime le .read () de la réponse:
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'])
Ça ne marche pas ... Je ne sais pas pourquoi.
Essaye ça:
jsonResponse = json.loads(response.decode('utf-8'))
Utilisez json.loads
pas json.load
.
(load
se charge depuis un objet de type fichier, loads
depuis une chaîne. Vous pouvez donc tout aussi bien omettre l'appel .read()
.)
Je ne connais pas encore python 3, mais il semble que urllib.request.urlopen (). Read () renvoie un objet byte plutôt qu'une chaîne.
Vous pouvez essayer de l'insérer dans un objet StringIO, ou même faire une str (réponse).
J'ai la même erreur {AttributeError: l'objet 'bytes' n'a pas d'attribut 'read'} dans python3 . Cela a fonctionné pour moi plus tard sans utiliser 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'))