在lxml中如何移除标签但保留所有内容?

24 投票
2 回答
18099 浏览
提问于 2025-04-16 09:54

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

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

我想要的结果是,去掉所有的 <a><c> 标签,但保留它们里面的文字内容和子节点,保持原样。同时,<b> 元素要保持不变。最终的结果应该是这样:

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

目前,我打算用一个很简单的方法:先把这个片段转换成字符串,然后用正则表达式去掉那些不需要的标签,最后再用处理后的结果替换掉原来的片段(这不是实际的代码,但大概是这样的):

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方法,但因为我想在原来是元素节点的地方插入文字,我觉得这样做可能不太行。

2 个回答

3

使用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:

这是一个要去掉的标签列表。只有这些标签会被移除,它们的内容会被提到父标签中。

41

试试这个链接: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>'

撰写回答