2011-08-03 1 views
8

위도와 경도에 따라 Google 어스에서 고도 데이터를 가져오고 싶지만이 작업을 수행 할 수 없습니다. 내가 뭘 잘못하고 있는지 모르겠지만 내 코드는 아래에 나와 있습니다.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); 

그리고 내가 오류는 다음과 같습니다

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 

어떤 도움에 감사드립니다.

답변

6

파이썬 3에서는 http 요청의 원시 응답과 같은 바이너리 데이터가 바이트 객체에 저장됩니다. json/simplejson은 문자열을 기대합니다. 해결책은 적절한 인코딩을 사용하여 바이트 데이터를 문자열 데이터로 디코딩하는 것입니다. 헤더에서 찾을 수 있습니다. 그런 다음 JSON 로더에 전달할 수있는

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

이 몸 : 당신은 그때까지 내용을 문자열을

encoding = req.headers.get_content_charset() 

:

당신은과 인코딩을 찾을 수 있습니다.

은 (또한, 응답 "REQ". 그것은 혼란을 호출 중지하고 그렇지 않은 요청입니다처럼 소리를 만들어주십시오.)

+0

내가 어디에서 변경했는지 이해할 수 없습니다. – user876307

+0

안녕하세요 regebro, pl. 내가 잘못한 곳에서 코드 아래로 나를 안내 해줘. – user876307

+2

@ user876307 : "변경 사항"이 없으므로 몇 가지가 필요합니다. 먼저 응답의 인코딩이 무엇인지 파악해야합니다. 응답을 업데이트합니다. 또한 4 개의 의견을 쓸 때 그다지 중요하지 않습니다. 하나는 아주 충분했을 것입니다. –

11

포스트 조금 늦었지만 최근에 달려있다 같은 문제. 아래 해결책은 나를 위해 일했습니다. 기본적으로 레나 트가 말한 것.

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

너무 늦지 마라! 솔루션을 가져 주셔서 감사합니다. – cdarke

+0

방금 ​​저를 구해 줬습니다! – Wurstbro