奇怪的lxml行为

1 投票
2 回答
2095 浏览
提问于 2025-04-15 15:07

考虑下面这段代码:

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

2 个回答

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"

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

撰写回答