Comment obtenir JSON d'une page Web dans un script Python

193

J'ai le code suivant dans l'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 les {{.....etc.....}}éléments que je vois sur l'URL lorsque je la charge dans Firefox dans mon script afin que je puisse en analyser une valeur. J'ai cherché une tonne sur Google, mais je n'ai pas trouvé de bonne réponse sur la façon d'obtenir réellement le {{...}}contenu d'une URL se terminant .jsonpar un objet dans un script Python.

Chris B
la source

Réponses:

316

Récupérez les données de l'URL puis appelez json.loadspar exemple

Exemple Python3 :

import urllib.request, json 
with urllib.request.urlopen("http://maps.googleapis.com/maps/api/geocode/json?address=google") as url:
    data = json.loads(url.read().decode())
    print(data)

Exemple Python2 :

import urllib, json
url = "http://maps.googleapis.com/maps/api/geocode/json?address=google"
response = urllib.urlopen(url)
data = json.loads(response.read())
print data

La sortie entraînerait quelque chose comme ceci:

{
"results" : [
    {
    "address_components" : [
        {
            "long_name" : "Charleston and Huff",
            "short_name" : "Charleston and Huff",
            "types" : [ "establishment", "point_of_interest" ]
        },
        {
            "long_name" : "Mountain View",
            "short_name" : "Mountain View",
            "types" : [ "locality", "political" ]
        },
        {
...
Anurag Uniyal
la source
30
Plutôt que d'utiliser json.loadsqui consomme une chaîne, utilisez (c'est pourquoi il .read()est obligatoire, utilisez json.load(response)plutôt.
awatts
PSL uniquement, concis et efficace
jlandercy
Est-ce urllib2préférable en Python2?
Jon-Eric le
110

Je suppose que vous souhaitez réellement obtenir des données à partir de l'URL:

jsonurl = urlopen(url)
text = json.loads(jsonurl.read()) # <-- read from it

Ou, consultez le décodeur JSON dans la bibliothèque de requêtes .

import requests
r = requests.get('someurl')
print r.json() # if response type was set to JSON, then you'll automatically have a JSON response here...
Jon Clements
la source
mérite le badge vert pour cette question! Merci!
Aziz Alto
27

Cela obtient un dictionnaire au format JSON à partir d'une page Web avec Python 2.X et Python 3.X:

#!/usr/bin/env python

try:
    # For Python 3.0 and later
    from urllib.request import urlopen
except ImportError:
    # Fall back to Python 2's urllib2
    from urllib2 import urlopen

import json


def get_jsonparsed_data(url):
    """
    Receive the content of ``url``, parse it as JSON and return the object.

    Parameters
    ----------
    url : str

    Returns
    -------
    dict
    """
    response = urlopen(url)
    data = response.read().decode("utf-8")
    return json.loads(data)


url = ("http://maps.googleapis.com/maps/api/geocode/json?"
       "address=googleplex&sensor=false")
print(get_jsonparsed_data(url))

Voir aussi: Exemple de lecture et d'écriture pour JSON

Martin Thoma
la source
24

J'ai trouvé que c'était le moyen le plus simple et le plus efficace d'obtenir JSON à partir d'une page Web lors de l'utilisation de Python 3:

import json,urllib.request
data = urllib.request.urlopen("https://api.github.com/users?since=100").read()
output = json.loads(data)
print (output)
Uxbridge
la source
4
Cela ne marche pas. Vous devez importer urlopen depuis urllib.request, c'estfrom urllib.request import urlopen
Dawid Laszuk
5

Tout ce que l'appel à urlopen()fait (selon la documentation ) est de retourner un objet semblable à un fichier. Une fois que vous avez cela, vous devez appeler sonread() méthode pour extraire les données JSON sur le réseau.

Quelque chose comme:

jsonurl = urlopen(url)

text = json.loads(jsonurl.read())
print text
bgporter
la source
5

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 dans Python 3. json.load est juste un wrapper autour de json.loads qui appelle read () pour un objet de type fichier. json.loads nécessite un objet string et la sortie de urllib.urlopen (url) .read () est un objet bytes. Il faut donc obtenir le codage du fichier pour le faire fonctionner en Python 3.

Dans cet exemple, nous interrogeons les en-têtes pour l'encodage et revenons à utf-8 si nous n'en obtenons pas. L'objet headers est différent entre Python 2 et 3, il doit donc être fait de différentes manières. L'utilisation de requêtes éviterait tout cela, mais vous devez parfois vous 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)
aviso
la source
Je sais que six ne fait pas non plus partie de la bibliothèque standard, mais il est montré ici pour plus de commodité. Sans cela, vous auriez besoin d'un bloc if / else ou try / except pour déterminer où obtenir urlopen ().
aviso
3

Il n'est pas nécessaire d'utiliser une bibliothèque supplémentaire pour analyser le json ...

json.loads()renvoie un dictionnaire .

Alors dans ton cas, fais juste text["someValueKey"]

posit labs
la source
3

Réponse tardive, mais pour python>=3.6vous pouvez utiliser:

import dload
j = dload.json(url)

Installer dloadavec:

pip3 install dload
CONvid19
la source
0

vous avez besoin import requestset utilisez la méthode json ():

source = requests.get("url").json()
print(source)

Bien sûr, cette méthode fonctionne également:

import json,urllib.request
data = urllib.request.urlopen("url").read()
output = json.loads(data)
print (output)
Mamal
la source
-1

vous pouvez utiliser json.dumps:

import json

# Hier comes you received data

data = json.dumps(response)

print(data)

pour charger json et l'écrire dans un fichier, le code suivant est utile:

data = json.loads(json.dumps(Response, sort_keys=False, indent=4))
with open('data.json', 'w') as outfile:
json.dump(data, outfile, sort_keys=False, indent=4)
Keivan
la source