Frage

Ich versuche, html5lib.sanitizer zu verwenden, um Benutzereingaben zu bereinigen, wie im vorgeschlagen Dokumente

Das Problem besteht darin, dass ich fehlerhafte Tags vollständig entfernen und sie nicht nur maskieren möchte (was ohnehin eine schlechte Idee zu sein scheint).

Die im Patch vorgeschlagene Problemumgehung Hier funktioniert nicht wie erwartet (es behält den inneren Inhalt von a <tag>content</tag>).

Konkret möchte ich so etwas machen:

Eingang:

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

Ausgabe:

<h1>Hello world</h1>
Lorem ipsum

Irgendwelche Ideen, wie man das erreichen kann?Ich habe BeautifulSoup ausprobiert, aber es scheint nicht gut zu funktionieren und lxml fügt ein <p></p> Tags an sehr seltsamen Orten (z. B.um src attrs).Bisher scheint html5lib das Beste für diesen Zweck zu sein, wenn ich es nur dazu bringen könnte, Tags zu entfernen, anstatt sie zu maskieren.

War es hilfreich?

Lösung

Die Herausforderung besteht darin, auch unerwünschte verschachtelte Tags zu entfernen.Es ist nicht schön, aber es ist ein Schritt in die richtige Richtung:

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)

Welche Ausgaben:

<h1>Hello world</h1>
Lorem ipsum
<b>Bold Text</b>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top