Supprimez complètement une mauvaise balise avec html5lib.sanitizer
-
14-11-2019 - |
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.
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>