Cómo obtener JSON de la página web en el script Python


193

Obtuve el siguiente código en uno de mis 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

Lo que quiero hacer es obtener {{.....etc.....}}lo que veo en la URL cuando lo cargo en Firefox en mi script para poder analizar un valor. Busqué en Google una tonelada pero no encontré una buena respuesta sobre cómo obtener realmente las {{...}}cosas de una URL que termina en .jsonun objeto en un script de Python.

Respuestas:


316

Obtenga datos de la URL y luego llame, json.loadspor ejemplo

Ejemplo de 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)

Ejemplo de 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

El resultado resultaría en algo como esto:

{
"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
En lugar de uso json.loadsque consume una cadena de uso (por eso .read()se requiere, utilice json.load(response)en su lugar.
awatts

Solo PSL, conciso y eficiente
jlandercy

¿Es urllib2preferible en Python2?
Jon-Eric

110

Supongo que realmente quieres obtener datos de la URL:

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

O consulte el decodificador JSON en la biblioteca de solicitudes .

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

merece la insignia verde por esta pregunta! ¡Gracias!
Aziz Alto

27

Esto obtiene un diccionario en formato JSON de una página web con Python 2.X y 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))

Ver también: Ejemplo de lectura y escritura para JSON


24

He encontrado que esta es la forma más fácil y eficiente de obtener JSON desde una página web cuando se usa Python 3:

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

44
Esto no funciona Debe importar urlopen desde urllib.request, es decirfrom urllib.request import urlopen
Dawid Laszuk, el

5

Todo lo que hace la llamada urlopen()(según los documentos ) es devolver un objeto similar a un archivo. Una vez que tenga eso, debe llamar a su read()método para extraer los datos JSON a través de la red.

Algo como:

jsonurl = urlopen(url)

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

5

En Python 2, json.load () funcionará en lugar de json.loads ()

import json
import urllib

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

Desafortunadamente, eso no funciona en Python 3. json.load es solo un contenedor alrededor de json.loads que llama a read () para un objeto similar a un archivo. json.loads requiere un objeto de cadena y la salida de urllib.urlopen (url) .read () es un objeto de bytes. Entonces uno tiene que obtener la codificación del archivo para que funcione en Python 3.

En este ejemplo, consultamos los encabezados para la codificación y volvemos a utf-8 si no obtenemos uno. El objeto de encabezado es diferente entre Python 2 y 3, por lo que debe hacerse de diferentes maneras. El uso de solicitudes evitaría todo esto, pero a veces debe atenerse a la biblioteca estándar.

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)

Sé que seis tampoco forma parte de la biblioteca estándar, pero se muestra aquí por conveniencia. Sin él, necesitaría un bloque if / else o try / except para determinar dónde obtener urlopen ().
aviso

3

No es necesario usar una biblioteca adicional para analizar el json ...

json.loads()devuelve un diccionario .

Entonces, en tu caso, solo hazlo text["someValueKey"]


3

Respuesta tardía, pero para python>=3.6que pueda usar:

import dload
j = dload.json(url)

Instalar dloadcon:

pip3 install dload

0

necesita import requestsy utiliza el método json ():

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

Por supuesto, este método también funciona:

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

-1

puedes usar json.dumps:

import json

# Hier comes you received data

data = json.dumps(response)

print(data)

para cargar json y escribirlo en el archivo, el siguiente código es útil:

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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.