練習問題として、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()
機能のチョークを作るのですか?
ありがとうございます。
問題があります:JSONはShift_JISでは決して転送されないはずです.JSONの有効なエンコーディングはUTF- *だけです。さらに、 'text/javascript'の実際のコンテンツタイプは奇妙です。さらに、FirefoxでそのURLを開くと、同じ応答が返されますが、UTF-8になります。 – Thanatos
@Thanatos GoogleがUser-Agentの文字列をチェックしているようです。そのURLを一般的なブラウザUser-Agent文字列(IExplorer 6、Firefox 3、Safariなどでテスト済み)でリクエストすると、UTF-8でエンコードされたレスポンスが得られます。どうしてか分かりません。 – raben
@Raben:実際には "Accept-Encoding"ヘッダかもしれないと思っていました - Firefoxは、urllibにはないISO-8859-1またはUTF-8のいずれかで明示的に結果を要求しているようです。それにもかかわらず、urllibに与えられた答えは間違っています。 – Thanatos