【发布时间】:2018-07-31 16:18:03
【问题描述】:
是否有一种全面的方法来查找 HTML 实体(包括外语字符)并将它们转换为十六进制编码或 ElementTree 接受的其他编码类型?对此有最佳做法吗?
我正在解析一个大型 XML 数据集,它使用 HTML 实体来编码 unicode 和特殊字符。我的脚本逐行传入一个 XML 文件。当我使用 python ElementTree 解析数据时,出现以下错误。
ParseError: undefined entity: line 296, column 29
我首先构建了一个字典来解析字符串并编码为十六进制。这减轻了许多错误。例如,将商标符号™ 转换为™。然而,看不到尽头。这是因为我已经开始找到 unicode 转义字符,例如 'Å'和 'ö' 表示外语。我已经查看了几个选项,并将在下面描述它们。
xmlcharrefreplace:这没有找到外语 HTML 转义值。
line = line.encode('ascii', 'xmlcharrefreplace')
HTMLParser.enescape(): 没用,我相信是因为 XML 需要转义一些字符,例如 ''。
h = HTMLParser.HTMLParser()
line = h.unescape(line)
编码为 UTF-8:我相信这不起作用,因为 XML 需要转义一些字符。
line = line.encode('utf-8')
BeautifulSoup:这返回了一个 BeautifulSoup 对象,当转换为字符串时,会在每一行添加一个 XML 版本标记,即使在替换它时,也会添加一些其他类型的字符。
line = BeautifulSoup(line, "xml")
line = str(line).replace('<?xml version="1.0" encoding="utf-8"?>', "").replace("\n", "")
htmlentitydefs:仍然设法遗漏了许多字符。例如,仍然错过了'?'和 '=',但是,这比其他选项让我更进一步。
from htmlentitydefs import name2codepoint
line = re.sub('&(%s);' % '|'.join(name2codepoint),
lambda m: unichr(name2codepoint[m.group(1)]), line)
【问题讨论】:
-
我们能否看到您的非 XML 数据集的代表性样本?
-
它是 XML。它的格式很好。问题并不存在,这个问题可以在没有 XML 示例的情况下进行思考。你不会从中收集到任何信息。我正在解析数百万条记录,并且大多数都解析得很好。它是那些非常旧的 html 实体,以及如何摆脱它们。那里有实体..例如'≦'无法通过 Google 搜索找到。
-
如果您引用了未定义的实体,那么您的数据集格式不正确,这意味着它不是 XML。
标签: python xml elementtree html-entities