使用html5lib.sanitizer完全移除一个不良标签

0 投票
1 回答
1047 浏览
提问于 2025-04-16 17:49

我正在尝试使用html5lib.sanitizer来清理用户输入,正如文档中所建议的那样。

问题是我想完全去掉那些不好的标签,而不仅仅是把它们转义(我觉得那样做也不太好)。

这里提到的解决方法并没有按预期工作(它保留了内容中的内部内容)。

具体来说,我想做这样的事情:

输入:

<script>bad_thing();</script>
<style>* { background: #000; }</style>
<h1>Hello world</h1>
Lorem ipsum

输出:

<h1>Hello world</h1>
Lorem ipsum

有没有什么好主意可以实现这个?我试过BeautifulSoup,但效果似乎不太好,而lxml在一些奇怪的地方插入了

标签(比如在src属性周围)。到目前为止,html5lib似乎是最适合这个目的的,如果我能让它去掉标签而不是转义它们就好了。

1 个回答

1

这个挑战是要去掉不需要的嵌套标签。虽然这个方法看起来不太好,但它是朝着正确方向迈出的一步:

from lxml.html import fromstring
from lxml import etree

html = '''
<script>bad_thing();</script>
<style>* { background: #000; }</style>
<h1>Hello world<script>bad_thing();</script></h1>
Lorem ipsum
<script>bad_thing();</script>
<b>Bold Text</b>
'''

l = []
doc = fromstring(html)
for el in doc.xpath(".//h1|.//b"):
    i = etree.Element(el.tag)
    i.text, i.tail = el.text, el.tail
    l.append(etree.tostring(i))

print ''.join(l)

这个代码的输出结果是:

<h1>Hello world</h1>
Lorem ipsum
<b>Bold Text</b>

撰写回答