我在使用 div 包装图像时遇到问题。
from lxml.html import fromstring
from lxml import etree
tree = fromstring('<img src="/img.png"/> some text')
div = etree.Element('div')
div.insert(0, tree.find('img'))
tree.insert(0, div)
print etree.tostring(tree)
<span><div><img src="/img.png"/> some text</div></span>
为什么要添加一个跨度,我怎样才能让它在没有文本的情况下环绕图像?
最佳答案
因为 lxml
实际上是一个 xml 解析器。它有一些宽容的解析规则,允许它解析 html(lxml.html
部分),但它总是会在内部构建一个有效的树。
'<img src="/img.png"/> some text'
不是树,因为它没有单一的根元素,有一个 img
元素和一个文本节点。为了能够在内部存储这个片段,lxml 需要将它包装在一个合适的标签中。如果你单独给它一个字符串,它会将它包装在一个 p
中。标签。早期版本只是将所有内容包装在 html
中标签,这可能会导致更多的困惑。
你也可以使用 html.fragment_fromstring
,在这种情况下不会添加标签,但会引发错误,因为该片段无效。
至于为什么文本坚持img
标签:这就是 lxml 存储文本的方式。举个例子:
>>> p = html.fromstring("<p>spam<br />eggs</p>")
>>> br = p.find("br")
>>> p.text
'spam'
>>> br.text # empty
>>> br.tail # this is where text that comes after a tag is stored
'eggs'
因此,通过移动标签,您也移动了它的尾部。
关于python - lxml 移动带有元素的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17711323/