如何在Python中解析损坏的XML?

4 投票
2 回答
2114 浏览
提问于 2025-04-16 03:20

有一个我无法控制的服务器,它发送的XML文件非常糟糕。

具体来说,一个Unicode的白色星星符号会被编码成UTF-8格式(E2 98 86),然后又用拉丁-1的HTML实体表进行转换。结果我得到的是â 98 86(9个字节),而这个文件被声明为UTF-8格式,但没有DTD(文档类型定义)。

我无法配置W3C tidy来处理这个问题,因为这样会导致信息不可逆地混乱。我只找到了一种方法,可以让lxml在遇到这个问题时悄悄跳过它。SAX使用的是Expat,这在遇到这个问题后无法恢复。我想避免使用BeautifulSoup,因为它速度比较慢。

还有什么其他的解决办法吗?

2 个回答

2

BeautifulSoup 是你在这种情况下最好的选择。我建议在完全排除 BeautifulSoup 之前,先进行一些性能测试。

0

也许可以这样做:

import htmlentitydefs as ents
from lxml import etree  # or maybe 'html' , if the input is still more broken
def repl_ent(m): 
     return ents.entitydefs[m.group()[1:-1]]
goodxml = re.sub( '&\w+;', repl_ent, badxml )
etree.fromstring( goodxml )

撰写回答