1

考虑以下代码段:

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正确处理?

4

2 回答 2

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
于 2009-10-16T12:55:34.977 回答
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"

于 2009-10-16T12:59:20.913 回答