在Python

时间:2016-09-28 00:32:32

标签: python xml lxml

我无法控制的服务器使用'>''&'''''''''''''&#39 ;属性和文本等。

小样本:

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

1 个答案:

答案 0 :(得分:3)

首先,要意识到没有XML解析器可以帮助您解决XML问题。&#34; XML解析器仅对XML进行操作,根据定义,XML必须为 well-formed

其次,无法修复&#34;破碎的XML&#34;在一般情况下。没有规则可以控制XML的破坏。&#34;如果没有明确定义&#34;破坏XML,&#34;您无法保证能够处理它并将其转换为真正的XML。

尽管如此,HTML Tidy在修复(X)HTML方面做得不错,而且修复XML的能力有限。对于自动修复“破碎的XML”,这是最好的选择。&#34;有一个Python包PyTidyLib,它包装了HTML Tidy库。