2012-09-03 37 views
2

我试图用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

+0

你能提供一个示例url吗? –

+0

目前我正在使用我在本地网络服务器上创建的示例数据。但从示例输出中应该可以看出。这只是一个带有自定义名称空间的HTML文档。 – Alexei

回答

2

几个意见:

  • HTML5似乎不支持的xmlns属性。引用section 1.6 of the latest HTML5 specification:“...名称空间不能用HTML语法表示,但它们在DOM和XHTML语法中受支持。”我看到你也尝试过使用XHTML,但是你现在使用的是HTML5,所以可能存在一个问题。 U+003A是冒号的Unicode,所以不知怎的,xmlns被注意到,但流行性感冒。至少在PHP版本中有an open issue with custom namespace elements

  • 我不明白html5lib这里的作用。为什么不直接使用lxml直接:

from lxml import etree 

tree = etree.fromstring(resp_text) 
print etree.tostring(tree, pretty_print=True) 

这似乎你想要做什么,没有html5lib和没有愚蠢的错误xmlnsU0003Afoo。使用我使用的测试HTML,我得到了正确的输出(如下),并且tree.nsmap包含'foo'的条目。

<html xmlns:foo="http://www.example.com/ns/foo"> 
    <head> 
     <title>yo</title> 
    </head> 
    <body> 
     <p>test</p> 
    </body> 
</html> 

或者,如果你想使用纯html5lib,你可以使用附带的simpletree

tree = html5lib.parse(resp_text, namespaceHTMLElements=True) 
print tree.toxml() 

虽然这不会弄脏的xmlns属性,simpletree遗憾的是缺乏更有力ElementTree功能如xpath()

+0

1.这里的问题不在于HTML5是否支持'xmlns'。问题是库似乎没有正确解析属性,不管它的意思,即我甚至不能这样做:'html.attrib ['xmlns:foo']'但是我不得不这样做:'html。 attrib ['xmlnsU0003Afoo']'(好吧,因为我必须像我不知道前缀一样行事,我必须遍历每个属性并查看它是否以'xmlnsU0003A'开头),我真的觉得很奇怪。 – Alexei

+0

2.我使用html5lib的原因有两个:其中之一就是目前我只是在愚弄,学习Python语言和其他很酷的东西。第二个是我正在构建的应用程序最终必须能够与网页上的真实页面一起工作,并且我希望它能够以浏览器看到它们的方式看待它们(并且因此,开发人员看到它们的方式,那就是整点)。 – Alexei

+0

3.我在他们关于PHP端口的问题列表中看到了该线程。这和聊天记录是我能找到的唯一的东西(聊天记录毫无意义,有人说'html5lib'在命名空间方面被破坏了)。我想在提出问题之前我会问人们,也许我做错了什么。 – Alexei