python - 在 Python 中清理损坏的 XML

标签 python xml lxml

我无法控制的服务器发送了损坏的 XML,其属性和文本中包含“>”、“&”、“<”等字符。

小样本:

<StockFormula Description="" Name="F_ΔTURN" RankType="Higher" Scope="Universe" Weight="10.86%">
    <Formula>AstTurnTTM>AstTurnPTM</Formula>
</StockFormula>
<Composite Name="Piotroski & Trends - <11@4w600k 70b" Weight="0%" RankType="Higher">
</Composite>

我决定使用 lxml 模块,因为它区分大小写,速度非常快并且可以完成工作。

我该如何修复这种类型的 XML?基本上,我试图用正确的转义序列替换所有出现的无效字符。

import re

broken = '<StockFormula Description="" Name="F_ΔTURN" RankType="Higher" Scope="Universe" Weight="10.86%">\n<Formula>AstTurnTTM>AstTurnPTM</Formula>\n<Composite Name="Piotroski & Trends - <11@4w600k 70b" Weight="0%" RankType="Higher">\n</Composite>'
print re.sub(r'(.*Name=".*)&(")', r'\g<1>&gt;\g<2>', broken)

输出:

<StockFormula Description="" Name="F_ÃŽâ€TURN" RankType="Higher" Scope="Universe" Weight="10.86%">
    <Formula>AstTurnTTM>AstTurnPTM</Formula>
</StockFormula>
<Composite Name="Piotroski & Trends - <11@4w600k 70b" Weight="0%" RankType="Higher">
</Composite>

最佳答案

首先,要认识到没有任何 XML 解析器可以帮助您处理“损坏的 XML”。 XML 解析器仅对 XML 进行操作,根据定义,XML 必须是 well-formed

其次,一般情况下不可能修复“损坏的 XML”。没有管理“损坏的 XML”的规则。如果没有明确定义“损坏的 XML”,就无法保证您能够处理它并将其转换为真正的 XML。

也就是说,HTML Tidy在修复 (X)HTML 方面做得不错,但修复 XML 的能力也很有限。这是自动修复“损坏的 XML”的最佳选择。有一个Python包,PyTidyLib ,它包装了 HTML Tidy 库。

关于python - 在 Python 中清理损坏的 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39736276/

相关文章:

python - 获取要展开的 WxPython 面板项

python - 在 matplotlib 中永久注册颜色图

python - 将函数视为 Python 中的对象

java - Xml 解析、编辑、保存并在 Java 中创建

python - 在 Mac 上的 Python 2.7.3 中导入 .pyd(使用 SWIG 创建)

c++ - MFC框架中如何使用XML over HTTP实现双向通信

android - 我正在创建一个 Android 应用程序。我正在尝试创建包含图像按钮的主菜单 GUI,但我的应用程序不断崩溃

python - lxml python加载没有标题和正文的html字符串并在目标元素周围添加元素

google-app-engine - Google App Engine Python 2.7 + lxml = Unicode ParserError

python - 使用 Python lxml 模块保留文本节点中的特殊字符