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