【问题标题】:lxml moves text with elementlxml 使用元素移动文本
【发布时间】:2013-07-17 22:23:59
【问题描述】:

我在用 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)

&lt;span&gt;&lt;div&gt;&lt;img src="/img.png"/&gt; some text&lt;/div&gt;&lt;/span&gt;

为什么要添加跨度,如何让它在没有文字的情况下环绕图像?

【问题讨论】:

    标签: python html lxml


    【解决方案1】:

    因为lxml 实际上是一个 xml 解析器。它有一些宽容的解析规则,允许它解析 html(lxml.html 部分),但它会在内部始终构建一个有效的树。

    '&lt;img src="/img.png"/&gt; 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'
    

    所以通过移动标签,你也移动了它的尾巴。

    【讨论】:

      【解决方案2】:

      lxml.html 是一个更友好、更温和的 xml 处理器,它试图理解无效的 xml。从 xml 的角度来看,您传入的刺痛只是垃圾,但 lxml.html 将其包装在 span 元素中以使其再次有效。如果您不希望 lxml.html 猜测,请坚持使用 lxml.etree.fromstring()。该版本将拒绝该字符串。

      【讨论】:

        猜你喜欢
        • 2011-11-18
        • 2019-05-27
        • 2012-12-27
        • 2016-05-03
        • 2017-09-11
        • 2015-02-14
        • 1970-01-01
        • 2011-07-22
        • 1970-01-01
        相关资源
        最近更新 更多