【发布时间】:2010-08-26 17:18:12
【问题描述】:
我无法影响的服务器发送非常损坏的 XML。
具体来说,Unicode WHITE STAR 将被编码为 UTF-8 (E2 98 86),然后使用 Latin-1 转换为 HTML 实体表。我得到的是一个文件中的â 98 86(9 个字节),该文件被声明为没有 DTD 的 utf-8。
我无法以一种不会造成不可逆转的混乱的方式来配置 W3C tidy。我只找到了如何让 lxml 静默地跳过它。 SAX 使用 Expat,遇到此问题后无法恢复。出于速度原因,我想避免使用 BeautifulSoup。
还有什么?
【问题讨论】:
-
不清楚:您是说服务器正在发送 XML 标头:"" xml 某处包含:"â\ x98\x86" ?
-
没错。我不知道服务器在什么时候对实体进行编码,所以我不愿意在调用解析器之前将其反转。
-
lxml.html 解析器(可能还有 Beautiful Soup )可以解析损坏的 XML,但他们无法修复它,所以你会得到一个 Unicode WHITE STAR (而且我认为你无法修复它也可以使用 SAX 实体处理程序)。在将字节流传递给解析器之前,您可能必须使用 re.sub 和 htmlentitydefs 修复字节流。 (我想知道什么样的进程可以写出这种损坏的输出?进程的一部分必须认为它正在编写 Latin-1 HTML,而另一部分认为它正在生成 UTF8 XML!)
-
在没有原生 unicode 支持的语言中容易犯错误。 AFAIK 服务器是用 PHP 编写的...
-
如果 XML 格式不正确,即损坏,则让生成它的人正确生成它。类似的,如果它不符合它应该符合的 DTD 或模式,则返回给发送者。