0

lxml を使用して、次のような構造を持つ xml ファイルを読み取ります

    <domain>http://www.trademe.co.nz</domain>         
    <start>http://www.trademe.co.nz/Browse/CategoryAttributeSearchResults.aspx?search=1&cid=5748&sidebar=1&rptpath=350-5748-4233-&132=FLAT&134=&153=&29=&122=0&122=0&59=0&59=0&178=0&178=0&sidebarSearch_keypresses=0&sidebarSearch_suggested=0</start>

私のpythonコードは次のとおりです。

from lxml import etree

tree = etree.parse('metaWeb.xml') 

実行すると entityref: expecting ';'エラーが発生します

ただし、xmlファイルで&シンボルを削除すると、すべて問題ありません。

どうすればそのエラーを解決できますか?

4

2 に答える 2

1

そう&&amp;ないと、xml は XML 標準に準拠していません。

于 2013-10-31T01:21:40.317 に答える
1

問題は、これが有効な XML ではないことです。XML では、&シンボルは常に、文字(別名)、文字、またはドキュメント/DTD/スキーマで定義されたカスタム エンティティなどのエンティティ参照を開始します。*&#1234;U+04D2Ӓ&quot;"

リテラルを文字列に入れたい場合は、それを別のもの (通常は、アンパサンド文字の文字エンティティ参照)&に置き換える必要があります。&amp;

したがって、ドキュメントに実際のエンティティ参照がなく、エスケープされていないアンパサンドだけがあることが確実な場合は、非常に簡単に修正できます。

with open('metaWeb.xml') as f:
    xml = f.read().replace('&', '&amp;')
tree = etree.fromstring(xml)

ただし、可能であれば、この誤った XML を生成しているプログラムを修正することをお勧めします。


* これは少し誤解を招く可能性があります。数字参照は、実際にはエンティティ参照ではありません。また、文字エンティティ参照は、置換テキストを含む他の参照と同様&quot;または&amp;同じであり、エンティティはたまたま XML/HTML ベースの DTD によって暗黙的に定義されています。ただしlxml、ほとんどの XML ソフトウェアと同様に、「エンティティ参照」という用語は、標準よりも少し広く使用されています。

于 2013-10-31T01:21:56.117 に答える