我正在尝试使用 html5lib.sanitizer 来清理用户输入,如文档中的建议
问题是我想完全删除坏标签,而不仅仅是逃避它们(无论如何这似乎是一个坏主意)。
此处补丁中建议的解决方法无法按预期工作(它保留<tag>content</tag>
的内部内容)。
具体来说,我想做这样的事情:
输入:
<script>bad_thing();</script>
<style>* { background: #000; }</style>
<h1>Hello world</h1>
Lorem ipsum
输出:
<h1>Hello world</h1>
Lorem ipsum
关于如何实现它的任何想法?我尝试过 BeautifulSoup,但它似乎效果不佳,lxml 在非常奇怪的地方(例如在 src attrs 周围)插入<p></p>
标签。到目前为止,html5lib 似乎是最好的选择,如果我能让它删除标签而不是转义它们。
挑战在于还要去除不需要的嵌套标签。它并不漂亮,但它是朝着正确方向迈出的一步:
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>