Question

J'essaie d'utiliser html5lib.sanitizer pour nettoyer les entrées utilisateur comme suggéré dans le documents

Le problème est que je veux supprimer complètement les mauvaises balises et pas seulement y échapper (ce qui semble de toute façon être une mauvaise idée).

La solution de contournement suggérée dans le patch ici ne fonctionne pas comme prévu (il conserve le contenu interne d'un <tag>content</tag>).

Plus précisément, je veux faire quelque chose comme ceci :

Saisir:

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

Sortir:

<h1>Hello world</h1>
Lorem ipsum

Des idées sur la façon d'y parvenir ?J'ai essayé BeautifulSoup, mais cela ne semble pas bien fonctionner, et lxml insère <p></p> tags dans des endroits très étranges (par ex.autour des attributs src).Jusqu'à présent, html5lib semble être la meilleure chose à faire, si je pouvais simplement lui faire supprimer les balises au lieu de leur échapper.

Était-ce utile?

La solution

Le défi consiste également à supprimer les balises imbriquées indésirables.Ce n'est pas joli mais c'est un pas dans la bonne direction :

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)

Quelles sorties :

<h1>Hello world</h1>
Lorem ipsum
<b>Bold Text</b>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top