Come ottenere JSON dalla pagina Web nello script Python


193

Ho ottenuto il seguente codice in uno dei miei script:

#
# 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

Quello che voglio fare è ottenere {{.....etc.....}}ciò che vedo nell'URL quando lo carico in Firefox nel mio script in modo da poterne analizzare un valore. Ho cercato su Google un sacco, ma non ho trovato una buona risposta su come ottenere effettivamente le {{...}}cose da un URL che termina .jsonin un oggetto in uno script Python.

Risposte:


316

Ottieni dati dall'URL e quindi chiama json.loadsad es

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

Esempio 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

L'output si tradurrebbe in qualcosa del genere:

{
"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" ]
        },
        {
...

30
Invece di usare ciò json.loadsche consuma un uso di stringa (che è il motivo per cui .read()è richiesto, usa json.load(response)invece.
sveglia il

Solo PSL, conciso ed efficiente
calunnia

È urllib2preferibile in Python2?
Jon-Eric,

110

Immagino che tu voglia effettivamente ottenere dati dall'URL:

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

Oppure, controlla il decodificatore JSON nella libreria delle richieste .

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

merita il badge verde per questa domanda! Grazie!
Aziz Alto,

27

Questo ottiene un dizionario in formato JSON da una pagina Web con Python 2.X e 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))

Vedi anche: Leggi e scrivi esempio per JSON


24

Ho trovato che questo è il modo più semplice ed efficiente per ottenere JSON da una pagina Web quando si utilizza Python 3:

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

4
Questo non funziona Devi importare urlopen da urllib.request, ovverofrom urllib.request import urlopen
Dawid Laszuk,

5

Tutto ciò che la chiamata urlopen()fa (secondo i documenti ) è restituire un oggetto simile a un file. Una volta che lo hai, devi chiamare il suo read()metodo per estrarre effettivamente i dati JSON attraverso la rete.

Qualcosa di simile a:

jsonurl = urlopen(url)

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

5

In Python 2, json.load () funzionerà invece di json.loads ()

import json
import urllib

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

Sfortunatamente, ciò non funziona in Python 3. json.load è solo un wrapper per json.loads che chiama read () per un oggetto simile a un file. json.loads richiede un oggetto stringa e l'output di urllib.urlopen (url) .read () è un oggetto byte. Quindi è necessario ottenere la codifica del file per farlo funzionare in Python 3.

In questo esempio interroghiamo le intestazioni per la codifica e torniamo a utf-8 se non ne otteniamo una. L'oggetto header è diverso tra Python 2 e 3, quindi deve essere fatto in modi diversi. L'uso delle richieste eviterebbe tutto ciò, ma a volte è necessario attenersi alla libreria 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)

So che sei non fa parte della libreria standard, ma è mostrato qui per comodità. Senza di esso, avresti bisogno di un blocco if / else o try / tranne per determinare dove ottenere urlopen ().
aviso,

3

Non è necessario utilizzare una libreria aggiuntiva per analizzare il json ...

json.loads()restituisce un dizionario .

Quindi nel tuo caso, fallo e basta text["someValueKey"]


3

Risposta in ritardo, ma per python>=3.6te puoi usare:

import dload
j = dload.json(url)

Installa dloadcon:

pip3 install dload

0

hai bisogno import requestse usi dal metodo json ():

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

Naturalmente, questo metodo funziona anche:

import json,urllib.request
data = urllib.request.urlopen("url").read()
output = json.loads(data)
print (output)

-1

puoi usare json.dumps:

import json

# Hier comes you received data

data = json.dumps(response)

print(data)

per caricare json e scriverlo su file è utile il seguente codice:

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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.