去除HTML标签 - lxml.html.clean.clean_html效果不如预期

2 投票
2 回答
3457 浏览
提问于 2025-04-17 11:13

我想从一个字符串中去掉所有的HTML标签,但保留一些我指定的标签。
如果我用默认设置来调用构造函数,一切都运行得很好:

>>> cleaner = lxml.html.clean.Cleaner()
>>> cleaner.clean_html('''<i>italic</i><script>alert('');</script>''')
'<span><i>italic</i></span>'

但是当我尝试指定一些标签时,事情就不再正常了:

>>> allowed_tags = ['i','s']
>>> cleaner = lxml.html.clean.Cleaner(remove_unknown_tags=False,allow_tags=allowed_tags)
>>> cleaner.clean_html('''<i>italic</i><s>strike</s>''')
'<span></span>'

那么我到底哪里出错了呢?

2 个回答

1

这看起来像是个错误。我在lxml==2.3.3这个版本里没有发现这个问题:

>>> from lxml.html import clean
>>> clean.clean_html('''<i>italic</i><script>alert('');</script>''')
'<span><i>italic</i></span>'
>>> c = clean.Cleaner(allow_tags='is', remove_unknown_tags=False)
>>> c.clean_html('''<i>italic</i><s>strike</s>''')
'<div><i>italic</i><s>strike</s></div>'
2

作为一种解决方法,你可以在 allowed_tags 中添加 spandiv 标签。

更新

lxml.html.Cleaner 尝试将 字符串转换成 HTML 树,方法是调用 fromstring,这个方法会检查文档是否有根节点,如果没有就会添加一个。所以你需要允许 spandiv 标签

撰写回答