2011-08-03 25 views
8

Google Earthから高度データを緯度と経度で取得したいのですが、これを行うことはできません。私は何が間違っているのか分かりませんが、私のコードは以下に示されています。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

Python 3では、HTTP要求の生の応答などのバイナリデータがバイトオブジェクトに格納されます。 json/simplejsonは文字列を要求します。解決策は、適切なエンコーディングを使用してバイトデータをストリングデータにデコードすることです。ヘッダーで見つけることができます。あなたはJSONローダーに渡すことができ

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

このボディ:あなたは、その後でコンテンツに文字列を作る

encoding = req.headers.get_content_charset() 

あなたが持つエンコーディングを見つけます。

(また、応答「REQ」を呼び出しを停止してください。それは混乱だし、それはそれではない、要求、であるように聞こえることができます。)

+0

私は変更をどこに置いたのか理解できません。 – user876307

+0

hi regebro、pl。私が間違っているところで私にコードの下を向ける。 – user876307

+2

@ user876307:「変更」はありませんが、いくつかの必要があります。まず、レスポンスのエンコーディングを調べる必要があります。答えを更新します。また、4つのコメントを書いても意味がありません。 1つはかなり十分だったでしょう。 –

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

関連する問題