Elimine una etiqueta incorrecta por completo con html5lib.sanitizer
-
14-11-2019 - |
Pregunta
Estoy intentando usar html5lib.sanitizer para limpiar la entrada del usuario como se sugiere en el documentos
El problema es que quiero eliminar las etiquetas defectuosas por completo y no simplemente escapar de ellas (lo que de todos modos parece una mala idea).
La solución alternativa sugerida en el parche. aquí no funciona como se esperaba (mantiene el contenido interno de un <tag>content</tag>
).
Específicamente, quiero hacer algo como esto:
Aporte:
<script>bad_thing();</script>
<style>* { background: #000; }</style>
<h1>Hello world</h1>
Lorem ipsum
Producción:
<h1>Hello world</h1>
Lorem ipsum
¿Alguna idea sobre cómo lograrlo?Probé BeautifulSoup, pero no parece funcionar bien y se insertan lxml. <p></p>
etiquetas en lugares muy extraños (p. ej.alrededor de atributos src).Hasta ahora, html5lib parece ser lo mejor para este propósito, si pudiera lograr que elimine las etiquetas en lugar de escapar de ellas.
Solución
El desafío es eliminar también las etiquetas anidadas no deseadas.No es bonito pero es un paso en la dirección correcta:
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)
Qué salidas:
<h1>Hello world</h1>
Lorem ipsum
<b>Bold Text</b>