请考虑一下:
import xml.etree.ElementTree as ET
xhtml = '''<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head><title>XHTML sample</title></head>
<body>
<p> Sample text</p>
</body>
</html>
'''
parser = ET.XMLParser()
parser.entity['nbsp'] = ' '
tree = ET.fromstring(xhtml, parser=parser)
print(ET.tostring(tree, method='xml'))
这呈现漂亮的文本表示xhtml
字符串。
但是,对于HTML5文档类型相同的XHTML文档:
xhtml = '''<!DOCTYPE html>
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head><title>XHTML sample</title></head>
<body>
<p> Sample text</p>
</body>
</html>
'''
我得到异常:
xml.etree.ElementTree.ParseError: undefined entity: line 5, column 19
所以解析器不能处理它,虽然我加nbsp
到实体字典。
同样的情况,如果我使用lxml
:
from lxml import etree
parser = etree.XMLParser(resolve_entities=False)
tree = etree.fromstring(xhtml, parser=parser)
print etree.tostring(tree, method='xml')
提出:
lxml.etree.XMLSyntaxError: Entity 'nbsp' not defined, line 5, column 26
虽然我已经设置解析器忽略实体。
这是为什么,以及如何使的XHTML文件解析与可能HTML5 doctype声明?
对于LXML部分解决方案是使用回收器:
parser = etree.XMLParser(resolve_entities=False, recover=True)
但我仍然在等待更好的。