Ich möchte allen für außer HTML/JavaScript abzustreifen:Was ist der schnellste Weg, bestimmte HTML-Tags in einer Python-Zeichenfolge zu entfernen?
<b></b>
<ul></ul>
<li></li>
<a></a>
Dank.
Ich möchte allen für außer HTML/JavaScript abzustreifen:Was ist der schnellste Weg, bestimmte HTML-Tags in einer Python-Zeichenfolge zu entfernen?
<b></b>
<ul></ul>
<li></li>
<a></a>
Dank.
Wollen Sie einen Weg, der schnell ist oder einen Weg, der richtig ist? Ein Regex-basierter Ansatz ist wahrscheinlich nicht korrekt und kann Sie bis zu XSS Angriffen öffnen.
Sie sollten einen HTML-Parser wie Beautiful Soup oder sogar htmllib
verwenden.
Auch <a>
kann javascript:
href
s enthalten und es gibt auch die verschiedenen on
* Attribute, die Javascript sind. Sie möchten wahrscheinlich alle ausziehen. Im Allgemeinen ist eine Whitelist-Methode am besten: Bewahren Sie nur Attribute (und Attributwerte) auf, von denen Sie wissen, dass sie sicher sind.
+1 für nicht Regex –
Ersetzen Sie die Elemente, die Sie behalten möchten mit einem Platzhalterwert, und setzen Sie dann alle verbleibenden <. *>, Ersetzen Sie schließlich die Platzhalter durch die entsprechenden HTML-Elemente.
Ich schlage vor, BBcode für die Platzhalter zu verwenden, die Ihnen den netten Nebeneffekt der Unterstützung BBcode ohne zusätzliche Berechnung gibt. – Daniel
Während ich Laurence zustimme, gibt es Gelegenheiten, bei denen ein schneller und schmutziger 99% -Ansatz die Aufgabe erledigt, ohne andere Probleme zu verursachen.
Hier ist ein Beispiel, das einen regulären Ausdruck basierten Ansatz demonstriert -
import re
CLEANBODY_RE = re.compile(r'<(/?)(.+?)>', re.M)
def _repl(match):
tag = match.group(2).split(' ')[0]
if tag == 'p':
return '<%sp>' % match.group(1)
elif tag in ('a', 'br', 'ul', 'li', 'b', 'strong', 'em', 'i'):
return match.group(0)
return u''
def cleanbody(html):
return CLEANBODY_RE.sub(_repl, html)
ein Wort. Regex :) – Machinarius
Haha, gruseliges Wort :) – ensnare