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.

¿Fue útil?

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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top