lxml が XML を処理する際の文字エンコーディングの問題

黄舟
リリース: 2017-04-18 09:16:02
オリジナル
2512 人が閲覧しました

問題を単純化するために、xmlの内容は次の形式に単純化されます:

<?xml version="1.0" encoding="gbk"?>
<DOCUMENT>
<da><![CDATA[中文,就是任性]]></da>
</DOCUMENT>
ログイン後にコピー

そのエンコーディングはgbkであり、ノードの1つは中国語の文字です。 lxmlを使用してノードの値を抽出する場合、次の例外が発生しました

lxml.etree.XMLSyntaxError: Extra content at the end of the document
ログイン後にコピー

この時点で対応する Python スクリプトは次のとおりです:

tst = u&#39;<?xml version="1.0" encoding="gbk"?><DOCUMENT><da><![CDATA[中文,就是任性]]></da></DOCUMENT>&#39;
for event,element in etree.iterparse(BytesIO(tst.encode(&#39;utf-8&#39;))):
    print("%s, %s" % (element.tag, element.text))
ログイン後にコピー

しかし、単純化する前に別の例外が報告されました

lxml.etree.XMLSyntaxError: input conversion failed due to input error, bytes 0x8B 0x2C 0xE6 0x9D
ログイン後にコピー

どの例外であっても、やはりエンコーディングに関連していると推測されます文字の形。
さまざまな試みが役に立たなかった後、スタックオーバーフローでこの記事を確認しました。この記事で言及されている問題は、コードの一部を追加してみました

tst = u&#39;<?xml version="1.0" encoding="gbk"?><DOCUMENT><da><![CDATA[中文,就是任性]]></da></DOCUMENT>&#39;
tst = tst.replace(&#39;encoding="gbk"&#39;, &#39;encoding="utf-8"&#39;)
for event,element in etree.iterparse(BytesIO(tst.encode(&#39;utf-8&#39;))):
    print("%s, %s" % (element.tag, element.text))
ログイン後にコピー

置換ステートメントを追加しました。前のエンコーディング = "gbk" をエンコーディング "utf-8" とすると、最終的に結果が得られます:

da, 中文,就是任性
DOCUMENT, None
ログイン後にコピー

以上がlxml が XML を処理する際の文字エンコーディングの問題の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!