python - lxml 移动带有元素的文本

标签 python html lxml

我在使用 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/

相关文章:

Python从自定义路径打开文件名

python - 概率质量函数和 2 掷骰子?

php - 可点击的 HTML 行将变量 POST 到不同的 PHP 脚本

python - 在 lxml 中,如何删除标签但保留所有内容?

python - anchor 元素的 XPath 不在某些父元素中?

python - 如何在 django 中为特定数据库创建模型?

python - PyCharm - 预期类型 'Optional[IO[str]]' ,取而代之的是 'TextIOWrapper[str]'

html - 标签分为两行时的垂直对齐标签和复选框

html - 处理具有相同名称的 CSS 类

python - XML 中的错误编码符号