web-dev-qa-db-fra.com

Comment obtenir JSON depuis une page Web dans le script Python

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 le {{.....etc.....}} que je vois sur l'URL lorsque je le charge dans Firefox dans mon script afin que je puisse en analyser une valeur. J'ai googlé une tonne, mais je n'ai pas trouvé de bonne réponse sur la façon d'obtenir le contenu de {{...}} à partir d'une URL se terminant par .json dans un objet situé dans un Python. scénario.

151
Chris B

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

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

exemple Python:

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)

La sortie donnerait 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" ]
        },
        {
...
264
Anurag Uniyal

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

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

Ou, consultez décodeur JSON dans la bibliothèque demandes .

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...
95
Jon Clements

Cela donne 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

25
Martin Thoma

J'ai trouvé que c'était le moyen le plus simple et le plus efficace d'obtenir du JSON à partir d'une page Web lorsque vous utilisiez Python 3:

import json,urllib.request
data = urllib.request.urlopen("https://api.github.com/users?since=100").read()
output = json.loads(data)
print (output)
20
Uxbridge

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

Quelque chose comme:

jsonurl = urlopen(url)

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

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

json.loads() renvoie un dictionnaire .

Donc, dans votre cas, faites simplement text["someValueKey"]

3
posit labs

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 chaîne et la sortie de urllib.urlopen (url) .read () est un objet octet. Il faut donc obtenir le codage du fichier pour que cela fonctionne dans Python 3.

Dans cet exemple, nous interrogeons les en-têtes pour le codage et retombons en utf-8 si nous n'en obtenons pas. L'objet d'en-tête est différent entre Python 2 et 3, il doit donc être effectué de différentes manières. Utiliser 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)
3
aviso

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)
0
Keivan