247 votes

Comment récupérer le JSON d'une page web dans un script de Python ?

J'ai le code suivant dans un de mes scripts :

#
# url is defined above.
#
jsonurl = urlopen(url)

#
# While trying to debug, I put this in:
#
print jsonurl

#
# Was hoping text would contain the actual json crap from the URL, but seems not...
#
text = json.loads(jsonurl)
print text

Ce que je veux faire, c'est obtenir le {{.....etc.....}} que je vois sur l'URL lorsque je la charge dans Firefox dans mon script afin que je puisse analyser une valeur à partir de celle-ci. J'ai fait des tonnes de recherches sur Google, mais je n'ai pas trouvé de réponse satisfaisante à la question de savoir comment obtenir l'adresse de l'URL. {{...}} à partir d'une URL se terminant par .json en un objet dans un script Python.

9voto

bgporter Points 11119

Tout ce que l'appel à urlopen() fait (selon la docs ) renvoie un objet de type fichier. Une fois que vous l'avez, vous devez appeler sa fonction read() pour tirer les données JSON à travers le réseau.

Quelque chose comme :

jsonurl = urlopen(url)

text = json.loads(jsonurl.read())
print text

5voto

aviso Points 1321

Dans Python 2, json.load() fonctionnera à la place de json.loads()

import json
import urllib

url = 'https://api.github.com/users?since=100'
output = json.load(urllib.urlopen(url))
print(output)

Malheureusement, cela ne fonctionne pas en Python 3. json.load est juste une enveloppe autour de json.loads qui appelle read() pour un objet de type fichier. json.loads requiert un objet string et la sortie de urllib.urlopen(url).read() est un objet bytes. Il faut donc obtenir l'encodage du fichier afin de le faire fonctionner en Python 3.

Dans cet exemple, nous interrogeons les en-têtes pour connaître l'encodage et nous nous rabattons sur utf-8 si nous n'en obtenons pas. L'objet headers est différent entre Python 2 et 3, il faut donc procéder de différentes manières. Utilisation de demande éviterait tout cela, mais il faut parfois s'en tenir à la bibliothèque standard.

import json
from six.moves.urllib.request import urlopen

DEFAULT_ENCODING = 'utf-8'
url = 'https://api.github.com/users?since=100'
urlResponse = urlopen(url)

if hasattr(urlResponse.headers, 'get_content_charset'):
    encoding = urlResponse.headers.get_content_charset(DEFAULT_ENCODING)
else:
    encoding = urlResponse.headers.getparam('charset') or DEFAULT_ENCODING

output = json.loads(urlResponse.read().decode(encoding))
print(output)

4voto

Pedro Lobito Points 6794

Pour python>=3.6 que vous pouvez utiliser :

import dload

j = dload.json(url)

Instalar dload avec :

pip3 install dload

3voto

posit labs Points 1179

Il n'y a pas besoin d'utiliser une bibliothèque supplémentaire pour analyser le json...

json.loads() renvoie un dictionnaire .

Donc dans votre cas, il suffit de faire text["someValueKey"]

3voto

Moe Kayali Points 1

Je ne sais pas pourquoi toutes les réponses précédentes utilisent json.loads . Tout ce dont vous avez besoin est :

import json
from urllib.request import urlopen

f = urlopen("https://www.openml.org/d/40996/json")
j = json.load(f)

Cela fonctionne parce que urlopen renvoie un objet de type fichier, qui fonctionne avec json.load .

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