2012-01-29 12 views
0

urllib2を使用してWebページをダウンロードし、MySQLデータベースに保存しようとしています。このような :python utf-8 HTMLのデコードエラー

result_text = result.read() 
result_text = result_text.decode('utf-8') 

は、しかし、私はこのエラーを取得する:

データ: 'UTF8' コーデックバイト0x88をデコードすることはできません

は今、HTMLのmetaタグは、と述べていますエンコーディングは確かにutf-8です。

result_text = result_text.decode('utf-8','replace') 

不正な文字を置き換え: アイブ氏は、この行でこの問題を回避するために管理しました。しかし、私はこれが、ダウンロードしたデータに何かが間違っている可能性があること、または貴重な文字を削除していることを示すものではないとは確信していません。 IUは、ページにもJavaScriptが含まれていると付け加えるべきですが、これは私が信じる限り問題ではありません。

これはなぜ起こっているのですか? おかげで、あなたの小さなデータサンプルの

+1

ページのすべての文字がutf-8であることを確認してください。ヘッダはそれが "嘘"になる可能性があります。 – DonCallisto

+4

'' utf8 'コーデックはバイト0x88をデコードできないというエラーが発生すると、違反バイトの位置も教えてください。場所が 'n'の場合は、' decode( 'utf-8')の呼び出しの前に 'print(repr(result_text [n-20:n + 20]))'というprint文を追加し、結果はここにあります。 – unutbu

+1

あなたはソースデータへのリンクを投稿していないので、適切な回答を与えることはできません。 ただし、ソースデータのUTF-8エンコーディングが悪い可能性があります。そのため、あなたができないことは何もありません。 –

答えて

0

分析:

>>> s = "\x98cW\x01\xa2\xbb\xba\xcc\xec\x90\xfc\xffP\xcb%\x01\x08" 
>>> u = s.decode('utf8', 'replace') 
>>> u 
u'\ufffdcW\x01\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdP\ufffd%\x01\x08' 
>>> u.count(u'\ufffd') 
9 
>>> len(u) 
16 

は、(1)それは時折、無効なシーケンスで、確かにUTF-8ではありません。ユニコード文字の50%以上が無効です。言い換えると、先に押してdata.decode('utf8', 'replace')を使用するのは良い考えではありません(このTINYサンプルに基づいています)。

(2)\x01(2回)と\x08という文字は、何とかバイナリデータがあると思われます。

(3)コメントで引用した(切り捨てられた)エラーメッセージは0x88と記載されていますが、サンプルデータには0x88はありません。

(4)最初にやったことを示すために質問を編集してください:(a)アクセスしているURLを含め、問題を再現するのに必要な最小限のコード(b)完全なエラーメッセージとトレースバック(c)メモリからの入力ではなく、(a)と(b)をコピー/貼り付けたという保証

+0

私はあなたのコメントに対処してみましょう:1. trueだけでなく、唯一の無効なシーケンスは、この "url:"部分にあり、私にとっては重要ではありません。 2.コードから 'result = proxy ['opener']。open(request)result_text = result.read() \t \t \t result_text.decode( 'utf-8')'私は公開できません。私は違った順序で違う順序を持っています。私はコピー/ psatedを持っている安心してください。 – WeaselFox

関連する問題