問題を単純化するために、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'<?xml version="1.0" encoding="gbk"?><DOCUMENT><da><![CDATA[中文,就是任性]]></da></DOCUMENT>' for event,element in etree.iterparse(BytesIO(tst.encode('utf-8'))): print("%s, %s" % (element.tag, element.text))
しかし、単純化する前に別の例外が報告されました
lxml.etree.XMLSyntaxError: input conversion failed due to input error, bytes 0x8B 0x2C 0xE6 0x9D
どの例外であっても、やはりエンコーディングに関連していると推測されます文字の形。
さまざまな試みが役に立たなかった後、スタックオーバーフローでこの記事を確認しました。この記事で言及されている問題は、コードの一部を追加してみました
tst = u'<?xml version="1.0" encoding="gbk"?><DOCUMENT><da><![CDATA[中文,就是任性]]></da></DOCUMENT>' tst = tst.replace('encoding="gbk"', 'encoding="utf-8"') for event,element in etree.iterparse(BytesIO(tst.encode('utf-8'))): print("%s, %s" % (element.tag, element.text))
置換ステートメントを追加しました。前のエンコーディング = "gbk" をエンコーディング "utf-8" とすると、最終的に結果が得られます:
da, 中文,就是任性 DOCUMENT, None
以上がlxml が XML を処理する際の文字エンコーディングの問題の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。