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

Conseguí 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 las cosas {{.....etc.....}} que veo en la URL cuando las cargué en Firefox en mi script para poder analizar un valor de la misma. He buscado en Google una tonelada, pero no he encontrado una buena respuesta sobre cómo obtener las cosas {{...}} de una URL que termina en .json en un objeto en una secuencia de comandos de Python.

Obtenga datos de la URL y luego llame a json.loads por ejemplo

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 

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) 

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

Supondré que realmente desea obtener datos de la URL:

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

O bien, 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... 

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

Descubrí que esta es la forma más fácil y eficiente de obtener JSON de una página web cuando utilizo Python 3:

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

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

Algo como:

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

No hay necesidad de usar una biblioteca extra para analizar el json …

json.loads() devuelve un diccionario .

Así que en tu caso, solo haz el text["someValueKey"]

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 envoltorio 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 encoding del archivo para que funcione en Python 3.

En este ejemplo, consultamos los encabezados para la encoding y volvemos a utf-8 si no obtenemos una. El objeto de los encabezados 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 es necesario 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) 

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)