56 votes

Python ; erreur urllib : AttributeError : L'objet 'bytes' n'a pas d'attribut 'read'.

Note : C'est Python 3, il n'y a pas d'urllib2. Aussi, 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'])

Ne fonctionne pas... Je ne sais pas pourquoi.

105voto

MRAB Points 9855

Essayez ça :

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

43voto

katrielalex Points 40655

Utilisez json.loads pas json.load .

( load charge à partir d'un objet de type fichier, loads à partir d'une chaîne de caractères. Vous pouvez donc tout aussi bien omettre le .read() à la place).

2voto

Dog eat cat world Points 333

Je ne suis pas encore familier avec python 3, mais il semble que urllib.request.urlopen().read() renvoie un byte plutôt qu'une chaîne de caractères.

Vous pouvez essayer de l'alimenter dans un StringIO ou même faire un str(response) .

0voto

Banjali Points 11

J'ai eu la même erreur {AttributeError: 'bytes' object has no attribute 'read'} en 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'))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X