0

ドキュメントで提案されているように、ユーザー入力をクリーンアップするために html5lib.sanitizer を使用しようとしています

問題は、悪いタグをエスケープするだけでなく、完全に削除したいことです (とにかく悪い考えのようです)。

ここのパッチで提案されている回避策は、期待どおりに機能しません ( a の内部コンテンツを保持します<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<p></p>は非常に奇妙な場所 (たとえば、src 属性の周囲) にタグを挿入します。これまでのところ、html5lib は、タグをエスケープする代わりにタグを削除することができれば、この目的に最適なようです。

4

1 に答える 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>
于 2011-05-17T22:28:15.920 に答える