使用非法特殊字符 (&) 解析 XML [重复]
Posted
技术标签:
【中文标题】使用非法特殊字符 (&) 解析 XML [重复]【英文标题】:Parsing XML with illegal special characters (&) [duplicate] 【发布时间】:2021-07-24 03:20:27 【问题描述】:我有成千上万的 XML 文件,比如 follow
<names>
<Id>1518845</Id>
<Name>Confessions of a Thug (Paperback)</Name>
<Authors>Philip Meadows Taylor</Authors>
<Publisher>Rupa & Co</Publisher>
<CountsOfReview>2.0</CountsOfReview>
</names>
我已经尝试了下面的代码来解析
from lxml import etree
root = etree.parse("xm_file.xml")
import xml.etree.ElementTree as ET
tree = ET.parse("xm_file.xml")
和
parser = ET.XMLParser(encoding="utf-8")
tree = ET.parse("xm_file.xml", parser=parser)
所有这些都会导致其中一个错误
ParseError: not well-formed (invalid token): line 10, column 18
XMLSyntaxError: xmlParseEntityRef: no name, line 10, column 19
我搜索并尝试了很多解决方案来解决这个问题,但徒劳无功
注意:这对我没有帮助:How to parse invalid (bad / not well-formed) XML?
另一种情况是
<names>
<Id>1481744</Id>
<Name>Lettres de René-Édouard Claparède <1832-1871>.: Choisies et annotées</Name>
<Authors>René-Édouard Claparède</Authors>
<ISBN>3796505635</ISBN>
<Rating>2.0</Rating>
<PublishYear>1971</PublishYear>
<PublishMonth>31</PublishMonth>
<PublishDay>12</PublishDay>
</names>
在解析它时,只需像处理 XML 一样处理它:
<names>
<Id>1481744</Id>
<Name>Lettres de René-Édouard Claparède</Name>
</names>
其他信息不显示
【问题讨论】:
也许这有帮助? ***.com/questions/7604436/… 这是 python 不是 php 但是解决方法是一样的。 这不是 XML,Jim,至少不是我们所知道的。您的问题标题不正确 - 您尝试解析的内容 不是 XML 您没有成千上万的 XML 文件。您有数以千计的非 XML 文件。事实上,你有一堆垃圾。 【参考方案1】:您可以预先替换 &
:
import xml.etree.ElementTree as ET
data = """
<names>
<Id>1518845</Id>
<Name>Confessions of a Thug (Paperback)</Name>
<Authors>Philip Meadows Taylor</Authors>
<Publisher>Rupa & Co</Publisher>
<CountsOfReview>2.0</CountsOfReview>
</names>
"""
data = data.replace('&', '&')
tree = ET.ElementTree(ET.fromstring(data))
for publisher in tree.findall("Publisher"):
print(publisher.text)
产量
Rupa & Co
一种可能的方法是之前加载有问题的文件,替换 &
并将其提供给 xml.etree.ElementTree
,如下所示:
with open("some_cool_file") as fp:
content = fp.read()
content = content.replace('&', '&')
xml = ET.ElementTree(ET.fromstring(content))
【讨论】:
请查看我对问题的编辑 不错的尝试,但 OP 为您添加了另一个测试。 @Jan,像这样替换&
是危险的,因为数据中可能存在实际的 XML 实体,这些实体随后会被破坏。是的,您可以使用更复杂的正则表达式来捕获其中的许多。无论如何,如何解析错误的“XML”这个一般性话题已经在其他问答中得到了更彻底的解决。以上是关于使用非法特殊字符 (&) 解析 XML [重复]的主要内容,如果未能解决你的问题,请参考以下文章