如何在Python中解析损坏的XML?
有一个我无法控制的服务器,它发送的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 )