Полностью удалите плохой тег с помощью html5lib.sanitizer - PullRequest
0 голосов
/ 17 мая 2011

Я пытаюсь использовать 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 вставляет теги <p></p> в очень странных местах (например, вокруг атрибутов src). Пока что html5lib кажется лучшим для этой цели, если бы я мог просто заставить его удалять теги, а не экранировать их.

1 Ответ

1 голос
/ 18 мая 2011

Задача состоит также в удалении нежелательных вложенных тегов. Это не красиво, но это шаг в правильном направлении:

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>
...