使用lxml读取xml文件获取错误EntityRef

时间:2013-10-31 01:17:55

标签: python lxml

我使用lxml来读取一个像bellow一样的结构的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 ';'错误

然而,当我删除&amp;在xml文件中的符号,一切都很好。

我该如何解决这个错误?

2 个答案:

答案 0 :(得分:1)

问题是这不是有效的XML。在XML中,&符号总是以entity reference开头,如&#1234;字符U+04D2(又名Ӓ),&quot;为字符",或您的文档/ DTD /架构中定义的某个自定义实体。*

如果要将文字&放入字符串中,则必须将其替换为其他内容,通常为&amp;,这是&符号的字符实体引用。

因此,如果您确定文档中没有实际的实体引用,只是未转义的&符号,您可以非常简单地修复它:

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

但是,如果可能的话,更好的解决方案是修复生成此错误XML的程序。


*这有点误导,相当真实;数字字符引用实际上不是实体引用。此外,像&quot;&amp;这样的字符实体引用与具有替换文本的任何其他引用相同,实体恰好由XML / HTML基础DTD隐式定义。但是,与大多数XML软件一样,lxml使用术语“实体引用”的范围略大于标准。

答案 1 :(得分:0)

&替换为xml文件中的&amp;,否则xml不符合XML标准。