0

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

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

ただし、次のエラーが発生します。

データ: 'utf8' コーデックはバイト 0x88 をデコードできません

現在、HTML メタ タグは、エンコーディングが実際に utf-8 であることを示しています。私はこの行でこれを回避することができました:

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

これは悪い文字を置き換えます。ただし、これがダウンロードしたデータに問題がある可能性があること、または貴重な文字を削除していることを示すものではないかどうかはわかりません. IU は、ページに JavaScript も含まれていることを追加する必要がありますが、これは問題ではないと私は信じています。

なぜこれが起こっているのか誰にも教えてもらえますか?ありがとう

4

1 に答える 1

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 ではありません。Unicode 文字の 50% 以上が無効です。言い換えれば、先に進んで使用することdata.decode('utf8', 'replace')は良い考えではありません (この TINY サンプルに基づく)。

(2) 文字\x01(2 回) と\x08、何らかの形でバイナリ データを取得したのではないかと思わせます。

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

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

于 2012-01-29T20:34:49.670 に答える