2011-11-02 6 views
12

私のコード作成者は、UserVoiceサイトからコンテンツを取得します。ご存じのように、UserVoiceは、データを正しく扱うことができないたわごとのソフトウェアです。実際には、検索ページのテキストの量を減らすために、300文字のテキストを切り取り、最後に「...」を追加します。例えば、は、マルチバイト文字の途中で切ってもかまわないので、部分的にutf-8 "バイト"になります。 è charの場合、\xc3\xa8sの代わりに\xc3が得られました。Python:JSON文字列を解析するときに破損したUnicodeバイトを処理します。

もちろん、この恐ろしいスープをjson.loadsに与えると、それはUnicodeDecodeErrorで失敗します。だから私の質問は簡単です:どうすればこれらの不良バイトを無視するようにjson.loadsを質問することができます、私は.decode('utf-8', 'ignore')機能の内部にアクセスしていた場合は使用しますか?

ありがとうございました。

答えて

11

あなたはsimplejsonにそれらを無視するよう要求しません。あなたのような問題が発生したときは、.decode('utf-8', 'ignore').encode('utf-8')を実行して処理を進めました。

+0

を[OK]を、私は現在、私は単にjson.loads' 'に渡す前に、文字列を復号してもよいと言って答えを書いていました。ありがとう、それは明らかに動作します! – zopieux

6

ただjson.loads()にUnicode文字列を渡します。

>>> badstr = "qualité"[:-1]+".." 
>>> badstr 
'qualit\xc3..' 
>>> json_str = '["%s"]' % badstr 
>>> import json 
>>> json.loads(json_str) 
Traceback (most recent call last): 
... 
UnicodeDecodeError: 'utf8' codec can't decode byte 0xc3 in position 6: invalid \ 
continuation byte 
>>> json.loads(json_str.decode('utf-8','ignore')) 
[u'qualit..'] 
+0

+1完全な説明。 –

+0

@Luchoからの回答には、追加の '.encode'が含まれています。 –

+0

@マテオ:いいえ。 json形式はUnicodeテキストのために定義されているので、 '.decode()'の後に '.encode()'は必要ありません。 – jfs

関連する問題