2010-12-07 9 views
1

練習問題として、GoogleがJSON APIを提案するスクリプトを作成しました。コードは非常に簡単です:jsonオブジェクトをデシリアライズしているときのエンコーディングエラー

query = 'a' 
url = "http://clients1.google.co.jp/complete/search?hl=ja&q=%s&json=t" %query 
response = urllib.urlopen(url) 
result = json.load(response) 
UnicodeDecodeError: 'utf8' codec can't decode byte 0x83 in position 0: invalid start byte 

私は応答オブジェクトread()にしようとすると、これは私が持っているものです:

'["a",["amazon","ana","au","apple","adobe","alc","\x83A\x83}\x83]\x83\x93","\x83A\x83\x81\x83u\x83\x8d","\x83A\x83X\x83N\x83\x8b","\x83A\x83\x8b\x83N"],["","","","","","","","","",""]]' 

だから、Pythonが解読しようとすると、エラーが発生していることを縫い目文字列これはgoogle.co.jpと日本語でのみ発生します。私は別のcontry/languagesと私は同じコードを試した同じ問題を取得しない:私はオブジェクトを逆シリアル化しようとするとすべて正常に動作します。

  • レスポンスヘッダーをチェックしていて、常にレスポンスエンコーディングとしてutf-8を指定しています。
  • 私はこの問題を解決するために、オンラインパーサ(http://json.parser.online.fr/)でJSON文字列をチェックし、もう一度[OK]

すべての縫い目任意のアイデア?何がJSON load()機能のチョークを作るのですか?

ありがとうございます。

答えて

3

レスポンスヘッダ(print response.header)は、次の情報が含まれてい

Content-Type: text/javascript; charset=Shift_JIS 

は、文字セットに注意してください。

あなたはそれが動作しますjson.loadにこのエンコーディングを指定した場合:

result = json.load(response, encoding='shift_jis') 
+0

問題があります:JSONはShift_JISでは決して転送されないはずです.JSONの有効なエンコーディングはUTF- *だけです。さらに、 'text/javascript'の実際のコンテンツタイプは奇妙です。さらに、FirefoxでそのURLを開くと、同じ応答が返されますが、UTF-8になります。 – Thanatos

+0

@Thanatos GoogleがUser-Agentの文字列をチェックしているようです。そのURLを一般的なブラウザUser-Agent文字列(IExplorer 6、Firefox 3、Safariなどでテスト済み)でリクエストすると、UTF-8でエンコードされたレスポンスが得られます。どうしてか分かりません。 – raben

+0

@Raben:実際には "Accept-Encoding"ヘッダかもしれないと思っていました - Firefoxは、urllibにはないISO-8859-1またはUTF-8のいずれかで明示的に結果を要求しているようです。それにもかかわらず、urllibに与えられた答えは間違っています。 – Thanatos

0

かかわらず、仕様は、文字列 "\ x83A \ X83} \ X83] \ X83 \ X93" は、UTF-8ではありません言うの。

["cp932"、 "shift_jis"、 "shift_jis_2004"、 "shift_jisx0213"]のいずれかです。これらのうちの1つとしてデコードしてみてください。

関連する問題