我试图用lxml
treebuilder解析一些HTML内容与html5lib
。注意:我使用requests
库来获取内容,内容是HTML5(使用XHTML尝试 - 结果相同)。html5lib与lxml treebuilder不能正确解析名称空间
当我简单地输出HTML源代码,它看起来好吗:
response = requests.get(url)
return response.text
回报
<html xmlns:foo="http://www.example.com/ns/foo">
但是当我竟与html5lib解析它,奇怪的事情发生了:
tree = html5lib.parse(response.text, treebuilder = 'lxml', namespaceHTMLElements = True)
html = tree.getroot()
return lxml.etree.tostring(html, pretty_print = False)
返回
<html:html xmlns:html="http://www.w3.org/1999/xhtml" xmlnsU0003Afoo="http://www.example.com/ns/foo">
注意xmlnsU0003Afoo
的事情。
此外,html.nsmap
字典不包含foo
命名空间,只有html
。
有没有人有关于正在发生什么的想法以及如何解决这个问题?
后来编辑:
看来,这是预期的行为:
如果所使用的XML API限制了元素的本地名称允许的字符和属性,则该工具可能将所有元素和属性的本地名称映射到一组允许的名称,通过替换大写字母U和字符的Unicode代码的六位数不支持的任何字符[...] - Coercing an HTML DOM into an infoset
你能提供一个示例url吗? –
目前我正在使用我在本地网络服务器上创建的示例数据。但从示例输出中应该可以看出。这只是一个带有自定义名称空间的HTML文档。 – Alexei