使用含有非法特殊字符(&)的XML解析

8 浏览
0 Comments

使用含有非法特殊字符(&)的XML解析

这个问题已经有了答案:

如何解析无效(错误/不规范)的XML?

将XML加载到php文件中时出现“xmlParseEntityRef:no name”警告

我需要在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日
0
0 Comments

您可以事先替换&

import xml.etree.ElementTree as ET
data = """

    1518845
    Confessions of a Thug (Paperback)
    Philip Meadows Taylor
    Rupa & Co
    2.0

"""
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))

0