使用含有非法特殊字符(&)的XML解析
使用含有非法特殊字符(&)的XML解析
这个问题已经有了答案:
我有成千上万个类似下面的XML文件
1518845 Confessions of a Thug (Paperback) Philip Meadows Taylor Rupa & Co 2.0
我试过下面的代码来解析
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
我搜寻和尝试了很多但都没有找到一个能够处理所有文件的解决方案
注意:这个没有帮助我:如何解析无效(错误/不规范)的XML?
另一种情况是
1481744 Lettres de René-Édouard Claparède <1832-1871>.: Choisies et annotées René-Édouard Claparède 3796505635 2.0 1971 31 12
在解析时,它只将XML处理为:
1481744 Lettres de René-Édouard Claparède
其他信息不出现
admin 更改状态以发布 2023年5月20日
您可以事先替换&
:
import xml.etree.ElementTree as ET data = """""" data = data.replace('&', '&') tree = ET.ElementTree(ET.fromstring(data)) for publisher in tree.findall("Publisher"): print(publisher.text) 1518845 Confessions of a Thug (Paperback) Philip Meadows Taylor Rupa & Co 2.0
这将产生:
Rupa & Co
一种可能的方法是在加载相关文件之前替换&
并将其提供给xml.etree.ElementTree
,示例如下:
with open("some_cool_file") as fp: content = fp.read() content = content.replace('&', '&') xml = ET.ElementTree(ET.fromstring(content))