Réponses
Trop de publicités?Je n'ai pas beaucoup pensé à le cas, il va manquer, mais vous pouvez faire une simple regex:
re.sub('<[^<]+?>', '', text)
Pour ceux qui ne comprennent pas les regex, cette recherche une chaîne de caractères <...>
, où le contenu interne est constituée d'un ou plus (+
) des personnages qui n'est pas un <
. L' ?
signifie qu'elle correspond à la plus petite chaîne qu'il peut trouver. Par exemple <p>Hello</p>
, il correspondra <'p>
et </p>
séparément avec l' ?
. Sans elle, il sera en adéquation avec l'ensemble de la chaîne de caractères <..Hello..>
.
En cas de non-tag <
s'affiche en html (par exemple. 2 < 3
), il devrait être écrit comme une séquence d'échappement &...
, de sorte que les ^<
peut être inutile.
Markupsafe est une bonne bibliothèque Python pour le cross-site scripting de prévention. Il est inclus dans Google App Engine, utilisé par Jinja2 (2.7), etc.
Voici leur expression régulière pour le décapage des balises HTML (GitHub lien de fichier, recherchez _striptags_re
):
re.sub(r'(<!--.*?-->|<[^>]*>)', '', text)
Vous pouvez arrêter de lire maintenant, sauf si vous voulez savoir comment il fonctionne...
Voici une chaîne que je vais utiliser pour les besoins de la démonstration:
>>> demo = '''<b>Normal stuff.</b>
... <!-- commented <b>out</b> -->
... <script<script>>alert("Hi!")<</script>/script>'''
Voici @mmmdreg de l'expression régulière à partir de ci-dessus:
>>> print re.sub(r'<[^<]*?>', '', demo)
Normal stuff.
<!-- commented out -->
<script>alert("Hi!")</script>
Oups, il a laissé l' <script>
par! (Merci @Julio García). Votre site web tout simplement connecté à votre mot de passe utilisateur et l'a envoyé à bad-guys.com. Le Cross-site scripting est la troisième plus fréquente de la vulnérabilité sur le web.
Voici la Markupsafe version, avec le traitement spécial des commentaires HTML supprimée:
>>> print re.sub(r'<[^>]*>', '', demo)
Normal stuff.
out -->
>alert("Hi!")/script>
Mieux. L'un des effets de cette expression régulière est qu'il est impossible de faire correspondre les ouvrir et de fermer les parenthèses - toute correspondance entre parenthèses sont supprimés. Il est donc fixe le <script> problèmes.
Il ne gère pas le commentaire très bien, bien. Nous ne voulons pas que le contenu du commentaire de le montrer à tous. De plus, les commentaires souvent contenir des balises à l'intérieur d'eux-mêmes, un traitement spécial est utile:
>>> print re.sub(r'(<!--.*?-->|<[^>]*>)', '', demo)
Normal stuff.
>alert("Hi!")/script>
Donc, cela a supprimé le commentaire et de crocs le script, que nous espérons. Yay!!!
J'ai besoin d'un moyen de bande de balises et de décoder les entités HTML en texte brut. La solution suivante est basée sur Eloff de la réponse (que je ne peux pas l'utiliser car il supprime les entités).
from HTMLParser import HTMLParser
import htmlentitydefs
class HTMLTextExtractor(HTMLParser):
def __init__(self):
HTMLParser.__init__(self)
self.result = [ ]
def handle_data(self, d):
self.result.append(d)
def handle_charref(self, number):
codepoint = int(number[1:], 16) if number[0] in (u'x', u'X') else int(number)
self.result.append(unichr(codepoint))
def handle_entityref(self, name):
codepoint = htmlentitydefs.name2codepoint[name]
self.result.append(unichr(codepoint))
def get_text(self):
return u''.join(self.result)
def html_to_text(html):
s = HTMLTextExtractor()
s.feed(html)
return s.get_text()
Un test rapide:
html = u'<a href="#">Demo <em>(¬ \u0394ημώ)</em></a>'
print repr(html_to_text(html))
Résultat:
u'Demo (\xac \u0394\u03b7\u03bc\u03ce)'
Gestion des erreurs:
- Code HTML non valide structure peut provoquer une HTMLParseError.
- Non valide nommé en entités HTML (comme
&#apos;
, ce qui est valable en XML et XHTML, mais pas en HTML) provoque uneValueError
d'exception. - Numérique entités HTML en spécifiant les points de code à l'extérieur de l'Unicode gamme acceptable par Python (tels que, sur certains systèmes, les personnages en dehors du Plan Multilingue de Base) va provoquer une
ValueError
d'exception.
Si vous avez besoin de préserver des entités HTML (c.-à-d. `` ), j’ai ajouté la méthode « handle_entityref » à la réponse de Eloff.