首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在lxml中,如何删除标记但保留所有内容?

在lxml中,如何删除标记但保留所有内容?
EN

Stack Overflow用户
提问于 2011-01-13 22:46:56
回答 2查看 14.6K关注 0票数 23

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

代码语言:javascript
复制
<fragment>text1 <a>inner1 </a>text2 <b>inner2</b> <c>t</c>ext3</fragment>

对于结果,我希望删除所有的<a>-和<c>-Tags,但保留它们的(文本)-contents和子节点。此外,<b>-Element应该保持不变。然后结果应该如下所示

代码语言:javascript
复制
<fragment>text1 inner<d>1</d> text2 <b>inner2</b> text3</fragment>

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

代码语言:javascript
复制
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,但是因为我想在以前有元素节点的地方插入文本,所以我认为我不能这样做。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-13 22:53:02

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

代码语言:javascript
复制
>>> etree.strip_tags(fragment,'a','c')
>>> etree.tostring(fragment)
'<fragment>text1 inner1 text2 <b>inner2</b> text3</fragment>'
票数 37
EN

Stack Overflow用户

发布于 2015-05-20 14:56:58

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

代码语言:javascript
复制
import lxml
from lxml.html.clean import Cleaner
cleaner = Cleaner()
cleaner.remove_tags = ['p']
remove_tags:

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4681317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档