奇怪的lxml行为

时间:2009-10-16 12:22:42

标签: python lxml

请考虑以下代码段:

import lxml.html

html = '<div><br />Hello text</div>'
doc = lxml.html.fromstring(html)
text = doc.xpath('//text()')[0]
print lxml.html.tostring(text.getparent())
#prints <br>Hello text

我原本希望看到'<div><br />Hello text</div>',因为br无法嵌套文字而且是“自我关闭”(我的意思是/>)。如何让lxml正确处理它?<​​/ p>

2 个答案:

答案 0 :(得分:8)

HTML没有自动关闭代码。这是一个xml的东西。

import lxml.etree

html = '<div><br />Hello text</div>'
doc = lxml.etree.fromstring(html)
text = doc.xpath('//text()')[0]
print lxml.etree.tostring(text.getparent())

打印

<br/>Hello text

请注意,文字不在标签内。 lxml有一个“tail”概念。

>>> print text.text
None
>>> print text.tail
Hello text

答案 1 :(得分:2)

当您处理有效的XHTML时,您可以使用etree代替html。

import lxml.etree

html = '<div><br />Hello text</div>'
doc = lxml.etree.fromstring(html)
text = doc.xpath('//text()')[0]
print lxml.etree.tostring(text.getparent())

有趣的是,您通常可以使用它将HTML转换为XHTML:

import lxml.etree
import lxml.html

html = '<div><br>Hello text</div>'
doc = lxml.html.fromstring(html)
text = doc.xpath('//text()')[0]
print lxml.etree.tostring(text.getparent())

输出:"<br/>Hello text"