2

私は、lxml HTMLパーサーを使用して、同僚がWebサイトのランダムサンプルから取得したHTMLを解析するPythonコードを使用しています。

そのうちの2つで、フォームのエラーが発生します

"'utf8'コーデックは位置502のバイト0xe20x80をデコードできません:データの予期しない終了"、

UTF-8HTMLコンテンツに破損した文字が含まれています。

eleと呼ばれるコード内の変数は、不正な文字でテキストを囲む<p>要素に割り当てられ、そのテキストにはele.textを介してアクセスできます。または、可能性がありますが、ele.textを別の変数に割り当てるだけで、が発生UnicodeDecodeErrorします。例外句で使用できるタイプのオブジェクトにUnicodeDecodeErrorは、テキスト内の不良バイトの開始位置と終了位置など、いくつかの有用な属性が含まれています。これを使用して、不良バイトが削除された新しい文字列を作成できますが、 ele.textのサブストリングを取得するなど、ele.textに何かを加えると、newUnicodeDetectErrorが発生します。の良い部分を救うために私にできることはありele.textますか?

私はこれをメモリから書いていますが、コードの詳細をすべて覚えているわけではないので、役立つ場合は明日より多くの情報を提供できます。私が覚えているのは、eleはのようなタイプのオブジェクトであり、lxml._Element解析されるファイルは実際にはにあり、ファイル内には、エンティティ&rdquo;に一致する文字のutf-8最初の2バイトがある場所があります。utf-8エンティティ&rdquo;が続きます。したがって、テキストには。が含まれます"xE2x80&amp;rdquo;"。エラーメッセージは、について文句を言い、"xE2x80"約520文字を含む文字列内での位置を示します。必要に応じて文字列全体を破棄することもできますが、位置情報を使用して"xE2x80"。何らかの理由で、ele.textを使用して何かを実行すると、lxmlの下位レベルのCythonコードでエラーが発生します。明日、仕事中にスタックトレースを提供できます。そのテキストで何かできることはありますか?ありがとう。

4

1 に答える 1

1

e2 80バイトだけではエラーは発生しません。

from lxml import html

html_data = b"<p>before &ldquo;\xe2\x80&rdquo; after"
p = html.fromstring(html_data)
print(repr(p.text))
# -> u'before \u201c\xe2\x80\u201d after'

@Esailja がコメントで指摘したように、上記はデータを utf-8 として解釈しません。utf-8 エンコーディングを強制するには:

from lxml import html

html_data = b"""<meta http-equiv="content-type"
                      content="text/html; charset=UTF-8">
                <p>before &ldquo;\xe2\x80&rdquo; after"""
doc = html.fromstring(html_data.decode('utf-8','ignore'))
print(repr(doc.find('.//p').text))
# -> u'before \u201c\u201d after'
  • utf-8 がドキュメントの正しい文字エンコーディングであることを確認してください
  • lxmlに渡す前に、壊れたバイトシーケンスを置き換えます
于 2013-01-15T08:35:26.267 に答える