2011-08-03 19 views
8

quiero conseguir los datos de elevación de Google Earth según la latitud y longitud, pero no soy capaz de hacer esto. No estoy seguro de lo que estoy haciendo mal, pero mi código se muestra a continuación.error al analizar los datos JSON

def getElevation(locations,sensor="true", **elvtn_args): 
    elvtn_args.update({ 
     'locations': locations, 
     'sensor': sensor 
    }) 

    url = ELEVATION_BASE_URL 
    params = urllib.parse.urlencode(elvtn_args) 
    baseurl = url +"?"+ params; 
    req = urllib.request.urlopen(str(baseurl)); 
    response = simplejson.load(req); 

Y el error que consigo es:

Traceback (most recent call last): 
    File "D:\GIS\Arctools\ElevationChart - Copy.py", line 85, in <module> 
    getElevation(pathStr) 
    File "D:\GIS\Arctools\ElevationChart - Copy.py", line 45, in getElevation 
    response = simplejson.load(req); 
    File "C:\Python32\lib\json\__init__.py", line 262, in load 
    parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw) 
    File "C:\Python32\lib\json\__init__.py", line 307, in loads 
    return _default_decoder.decode(s) 
    File "C:\Python32\lib\json\decoder.py", line 351, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
TypeError: can't use a string pattern on a bytes-like object 

Cualquier ayuda apreciada.

Respuesta

6

En Python 3, datos binarios, tales como la respuesta en bruto de una solicitud http, se almacena en objetos bytes. json/simplejson espera cadenas. La solución es decodificar los datos de bytes a datos de cadena con la codificación adecuada, que puede encontrar en el encabezado.

a encontrar la codificación con:

encoding = req.headers.get_content_charset() 

A continuación, hacer el contenido de una cadena por:

body = req.readall().decode(encoding) 

Este cuerpo puede entonces pasar al cargador de JSON.

(También, por favor, dejar de llamar a la respuesta "req". Es confuso, y hace que suena como que es una solicitud, que no lo es.)

+0

no puedo entender que donde pongo el cambio. – user876307

+0

hola regebro, pl. dirígeme del código de abajo donde estoy equivocado. – user876307

+2

@ user876307: No hay "un cambio", hay varios necesarios. Primero necesita averiguar en qué codificación está la respuesta. Actualizaré la respuesta. Además, no tiene sentido escribir 4 comentarios. Uno hubiera sido suficiente. –

11

Post es un poco tarde, pero recientemente se topó con la el mismo problema. La solución a continuación funcionó para mí. Básicamente lo que dijo Lennart.

from urllib import request 
import json 

req = request.urlopen('https://someurl.net/api') 
encoding = req.headers.get_content_charset() 
obj = json.loads(req.read().decode(encoding)) 
+1

¡Nunca es demasiado tarde! Gracias por la solución. – cdarke

+0

¡Me acabas de salvar! – Wurstbro

Cuestiones relacionadas