Obtengo la información meteorológica de una URL.
weather = urllib2.urlopen('url')
wjson = weather.read()
y lo que obtengo es:
{
"data": {
"current_condition": [{
"cloudcover": "0",
"humidity": "54",
"observation_time": "08:49 AM",
"precipMM": "0.0",
"pressure": "1025",
"temp_C": "10",
"temp_F": "50",
"visibility": "10",
"weatherCode": "113",
"weatherDesc": [{
"value": "Sunny"
}],
"weatherIconUrl": [{
"value": "http:\/\/www.worldweatheronline.com\/images\/wsymbols01_png_64\/wsymbol_0001_sunny.png"
}],
"winddir16Point": "E",
"winddirDegree": "100",
"windspeedKmph": "22",
"windspeedMiles": "14"
}]
}
}
¿Cómo puedo acceder a cualquier elemento que desee?
si lo hago: print wjson['data']['current_condition']['temp_C']
obtengo un error que dice:
los índices de cadena deben ser enteros, no str.
requests
es una manera asombrosa de llevarse bien con JSON ... Si está manejando URL complicadas ... úselo.Respuestas:
import json weather = urllib2.urlopen('url') wjson = weather.read() wjdata = json.loads(wjson) print wjdata['data']['current_condition'][0]['temp_C']
Lo que obtienes de la URL es una cadena json. Y no puede analizarlo directamente con index. Debería convertirlo en un diccionario
json.loads
y luego puede analizarlo con index.En lugar de usar
.read()
para guardarlo de forma intermedia en la memoria y luego leerlojson
, permitejson
cargarlo directamente desde el archivo:wjdata = json.load(urllib2.urlopen('url'))
fuente
json.loads()
. Solo está tratando de acceder al JSON directamente ... sin transformarse en nada legible por Python o usar un módulo para hacerlo.json.load(urllib2.urlopen('url'))
lo carga directamente en lugar de guardarlo de forma intermedia en la memoriaAquí hay una solución alternativa que usa solicitudes :
import requests wjdata = requests.get('url').json() print wjdata['data']['current_condition'][0]['temp_C']
fuente
'temp_C' es una clave dentro del diccionario que está dentro de una lista que está dentro de un diccionario
De esta manera funciona:
wjson['data']['current_condition'][0]['temp_C'] >> '10'
fuente
Otra forma alternativa de usar el método get con solicitudes:
import requests wjdata = requests.get('url').json() print wjdata.get('data').get('current_condition')[0].get('temp_C')
fuente
Solo por más de una opción ... También puedes hacerlo de esta manera:
MYJSON = { 'username': 'gula_gut', 'pics': '/0/myfavourite.jpeg', 'id': '1' } #changing username MYJSON['username'] = 'calixto' print(MYJSON['username'])
Espero que esto pueda ayudar.
fuente