Полностью удалите плохой тег с помощью html5lib.sanitizer.
-
14-11-2019 - |
Вопрос
Я пытаюсь использовать 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 attrs).На данный момент 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>