Pergunta

Estou tentando usar o html5lib.sanitizer para limpar a entrada do usuário, conforme sugerido no documentos

O problema é que quero remover completamente as tags ruins e não apenas escapar delas (o que parece uma má ideia, de qualquer maneira).

A solução alternativa sugerida no patch aqui não funciona como esperado (mantém o conteúdo interno de um <tag>content</tag>).

Especificamente, quero fazer algo assim:

Entrada:

<script>bad_thing();</script>
<style>* { background: #000; }</style>
<h1>Hello world</h1>
Lorem ipsum

Saída:

<h1>Hello world</h1>
Lorem ipsum

Alguma idéia de como conseguir isso?Eu tentei o BeautifulSoup, mas não parece funcionar bem e o lxml insere <p></p> tags em lugares muito estranhos (por ex.em torno de atributos src).Até agora, html5lib parece ser a melhor coisa para esse propósito, se eu conseguisse remover tags em vez de escapar delas.

Foi útil?

Solução

O desafio é também remover tags aninhadas indesejadas.Não é bonito, mas é um passo na direção certa:

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)

Quais saídas:

<h1>Hello world</h1>
Lorem ipsum
<b>Bold Text</b>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top