Python 解析时转义错误的XML

Python 解析时转义错误的XML,python,xml,python-3.x,elementtree,Python,Xml,Python 3.x,Elementtree,我正在尝试解析一个XML站点地图中的URL,但它不是我的。不幸的是,一些XML编写得很糟糕,并且包含未转义/无效字符,如符号 这是我当前用来解析XML文件的代码块: from xml.etree import ElementTree as ET tree = ET.parse('test.xml') root = tree.getroot() name_space = '{http://www.sitemaps.org/schemas/sitemap/0.9}' urls = [] for

我正在尝试解析一个XML站点地图中的URL,但它不是我的。不幸的是,一些XML编写得很糟糕,并且包含未转义/无效字符,如符号

这是我当前用来解析XML文件的代码块:

from xml.etree import ElementTree as ET

tree = ET.parse('test.xml')
root = tree.getroot()

name_space = '{http://www.sitemaps.org/schemas/sitemap/0.9}'

urls = []
for child in root.iter():
    for block in child.findall('{}url'.format(name_space)):
        for url in block.findall('{}loc'.format(name_space)):
            urls.append('{}\n'.format(url.text))

with open('sample_urls.txt', 'w+') as f:
    f.writelines(urls)
当它遇到一个未替换的URL:ParseError:not-well format(无效令牌)时,我遇到了这个错误

如何避免这些问题并继续解析文件?我遇到了xml.sax.saxutils模块的escape()函数,但根据我目前拥有的功能,不确定应用它的最佳方法。

如果可以,请尝试使用。但是你应该小心;它会忽略名称空间,因此您需要确保选择的是您想要选择的内容

例如

sitemap\u products\u 1.xml(链接到的网址的缩写版本。请注意,第二个
url
loc
值不正确。)


https://www.samsclub.com/sams/mirror-convex/prod13760282.ip
查看所有160度凸面安全镜-24英寸宽x 15英寸高
https://scene7.samsclub.com/is/image/samsclub/0003308171524_A
https://www.samsclub.com/sams/at&t-3-handset-Wireless-phone/prod21064454.ip
美国电话电报公司;T3手持无绳电话
https://scene7.samsclub.com/is/image/samsclub/0065053003067_A
https://www.samsclub.com/sams/premium-free-flow-waterbed-mattress-kit-queen/104864.ip
高级自由流动水床床垫套件-双人床
https://scene7.samsclub.com/is/image/samsclub/0040649555859_A
Python3.x

从lxml导入html
tree=html.parse(“sitemap\u products\u 1.xml”)
对于tree.findall(“.//url/loc”)中的元素:
打印(元素文本)
输出(请注意,第二个url是完整打印的。)

https://www.samsclub.com/sams/mirror-convex/prod13760282.ip
https://www.samsclub.com/sams/at&t-3-handset-Wireless-phone/prod21064454.ip
https://www.samsclub.com/sams/premium-free-flow-waterbed-mattress-kit-queen/104864.ip

鉴于您发布的示例,我想说,对于
&
字符,使用正则表达式就足够了。除非您完全希望删除此类
元素。下面的“算法”应该可以帮助您恢复这些错误

  • 由于
    &t-
    内部的
    ../at&t-3-handset-Wireless…
    非常清晰 不是有效的符号和字符代码,您可以捕获所有内容 在
    和第一个
    之间
    的值或
    结束标记的开头(
    我找到了一个解决方法,通过切换到lxml工具包下的etree并添加'parser=ET.XMLParser(recover=True)'和'tree=ET.parse('test.xml',parser=parser),可以忽略这些问题“。这似乎会删除URL中有问题的部分并继续。虽然不如转义好,但在紧急情况下可以工作。您不能预处理XML并删除所有无效字符吗?当然,您不能避免例如元素未关闭,但这应该是一个开始。如果您可以使用e您遇到的错误。我遇到的问题是如何在不破坏XML有效部分的情况下进行预处理。我只需要转义url节点中的内容。下面是一个XML站点地图被破坏的示例:有趣的是,这对于我来说肯定行得通。