web-dev-qa-db-fra.com

Python; Erreur urllib: AttributeError: l'objet 'bytes' n'a pas d'attribut 'read'

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.

20
Parseltongue

Essaye ça:

jsonResponse = json.loads(response.decode('utf-8'))
56
MRAB

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().)

12
Katriel

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).

2
Dog eat cat world

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'))
0
Banjali