"在lxml中,如何删除一个标签但保留所有内容?"

2024-09-28 17:25:44 发布

您现在位置:Python中文网/ 问答频道 /正文

问题是:我有一个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>

目前,我将返回到一个非常肮脏的技巧:我将etree.tostring片段,通过regex删除有问题的标记,并将原始片段替换为此的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来实现这一点,但是由于我想在以前有一个element节点的地方插入文本,所以我认为我不能这样做。


Tags: 标记文本节点lxmlreplaceetreefromstringtext1
2条回答

使用lxml的Cleaner函数从html内容中删除标记。 下面是一个做你想做的事情的例子。对于HTML文档,Cleaner是比使用strip_元素更好的解决问题的通用方法,因为在这种情况下,您不仅要去掉标记,还需要去掉其他标记上的onclick=function()属性。

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

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

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

相关问题 更多 >