【问题标题】:In lxml, how do I remove a tag but retain all contents?在 lxml 中,如何删除标签但保留所有内容?
【发布时间】:2011-06-08 13:18:45
【问题描述】:

问题是这样的:我有一个这样的 XML 片段:

<fragment>text1 <a>inner1 </a>text2 <b>inner2</b> <c>t</c>ext3</fragment>

对于结果,我想删除所有&lt;a&gt;- 和&lt;c&gt;-Tag,但保留它们的(文本)内容和子节点原样。此外,&lt;b&gt;-Element 应该保持不变。结果应该是这样的

<fragment>text1 inner<d>1</d> text2 <b>inner2</b> text3</fragment>

暂时,我将恢复一个非常肮脏的技巧:我将 etree.tostring 片段,通过正则表达式删除有问题的标签,并用 etree.fromstring 结果替换原始片段(不是真正的代码,但应该是这样的):

from lxml import etree
fragment = etree.fromstring("<fragment>text1 <a>inner1 </a>text2 <b>inner2</b> <c>t</c>ext3</fragment>")
fstring = etree.tostring(fragment)
fstring = fstring.replace("<a>","")
fstring = fstring.replace("</a>","")
fstring = fstring.replace("<c>","")
fstring = fstring.replace("</c>","")
fragment = etree.fromstring(fstring)

我知道我大概可以使用 xslt 来实现这一点,并且我知道 lxml 可以利用 xslt,但是必须有更多 lxml 原生的方法吗?

供参考:我尝试使用 lxml 的 element.replace 到达那里,但由于我想在之前有元素节点的地方插入文本,我认为我不能这样做。

【问题讨论】:

    标签: python xml lxml


    【解决方案1】:

    试试这个:http://lxml.de/api/lxml.etree-module.html#strip_tags

    >>> etree.strip_tags(fragment,'a','c')
    >>> etree.tostring(fragment)
    '<fragment>text1 inner1 text2 <b>inner2</b> text3</fragment>'
    

    【讨论】:

    • 谢谢,这很好用。我没有想到“脱衣舞”这个词,或者我自己可能已经找到了答案:)
    • 也很棒:etree.strip_elements(fragment, *['tag1', 'tag2'])
    • 正是我想要的。更好的是,strip_tags() 接受通配符,因此将"*" 作为标签传递会从树中删除所有标签。完全。
    【解决方案2】:

    使用 lxml 的 Cleaner 功能从 html 内容中删除标签。 下面是一个做你想做的事的例子。对于 HTML 文档,Cleaner 是比使用 strip_elements 更好的通用解决方案,因为在这种情况下,您想要去除的不仅仅是标签;您还想摆脱其他标签上的 onclick=function() 属性之类的东西。

    import lxml
    from lxml.html.clean import Cleaner
    cleaner = Cleaner()
    cleaner.remove_tags = ['p']
    remove_tags:
    

    要删除的标签列表。只有标签会被删除,它们的内容会被拉到父标签中。

    【讨论】:

      猜你喜欢
      • 2017-01-12
      • 1970-01-01
      • 2011-01-02
      • 2013-07-02
      • 2019-09-23
      • 2016-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多