Compte tenu du cas d'utilisation de Django, il y a deux réponses à cela. Voici sa django.utils.html.escape
fonction, pour référence:
def escape(html):
"""Returns the given HTML with ampersands, quotes and carets encoded."""
return mark_safe(force_unicode(html).replace('&', '&').replace('<', '&l
t;').replace('>', '>').replace('"', '"').replace("'", '''))
Pour inverser cela, la fonction Cheetah décrite dans la réponse de Jake devrait fonctionner, mais il manque le guillemet simple. Cette version inclut un tuple mis à jour, avec l'ordre de remplacement inversé pour éviter les problèmes symétriques:
def html_decode(s):
"""
Returns the ASCII decoded version of the given HTML string. This does
NOT remove normal HTML tags like <p>.
"""
htmlCodes = (
("'", '''),
('"', '"'),
('>', '>'),
('<', '<'),
('&', '&')
)
for code in htmlCodes:
s = s.replace(code[1], code[0])
return s
unescaped = html_decode(my_string)
Ceci, cependant, n'est pas une solution générale; il n'est approprié que pour les chaînes encodées avec django.utils.html.escape
. Plus généralement, c'est une bonne idée de s'en tenir à la bibliothèque standard:
# Python 2.x:
import HTMLParser
html_parser = HTMLParser.HTMLParser()
unescaped = html_parser.unescape(my_string)
# Python 3.x:
import html.parser
html_parser = html.parser.HTMLParser()
unescaped = html_parser.unescape(my_string)
# >= Python 3.5:
from html import unescape
unescaped = unescape(my_string)
À titre indicatif: il peut être plus judicieux de stocker le HTML sans échappement dans votre base de données. Il vaudrait la peine de chercher si possible à récupérer des résultats non échappés de BeautifulSoup et d'éviter complètement ce processus.
Avec Django, l'échappement se produit uniquement lors du rendu du modèle; donc pour éviter de vous échapper, dites simplement au moteur de création de modèles de ne pas échapper à votre chaîne. Pour ce faire, utilisez l'une de ces options dans votre modèle:
{{ context_var|safe }}
{% autoescape off %}
{{ context_var }}
{% endautoescape %}
html.parser.HTMLParser().unescape()
est obsolète dans la version 3.5. Utilisezhtml.unescape()
plutôt.Avec la bibliothèque standard:
HTML Escape
HTML Unescape
la source
HTMLParser
doit être sous-classé, dit quoi faire de toutes les parties de tout objet auquel il est alimenté, puis alimenté l'objet à analyser, comme vu ici . En outre, vous souhaiterez toujours utiliser lename2codepoint
dict pour convertir chaque identité HTML en le caractère réel qu'elle représente.HTMLParser
non sous- classés ne pourraient pas fonctionner comme nous le souhaitions si nous y ajoutions une entité HTML. Peut - être que je devrais renommerhtmlparser
pour_htmlparser
afin de le cacher, et exposer seulement launescape
méthode pour être comme une fonction d'assistance.from html import unescape
placePour l'encodage html, il y a cgi.escape de la bibliothèque standard:
Pour le décodage html, j'utilise ce qui suit:
Pour tout ce qui est plus compliqué, j'utilise BeautifulSoup.
la source
Utilisez la solution de Daniel si le jeu de caractères encodés est relativement restreint. Sinon, utilisez l'une des nombreuses bibliothèques d'analyse HTML.
J'aime BeautifulSoup car il peut gérer du XML / HTML malformé:
http://www.crummy.com/software/BeautifulSoup/
pour votre question, il y a un exemple dans leur documentation
la source
from bs4 import BeautifulSoup
BeautifulSoup("Sacré bleu!").contents[0]
Dans Python 3.4+:
la source
Voir en bas de cette page sur le wiki Python , il y a au moins 2 options pour "unescape" html.
la source
Commentaire de Daniel comme réponse:
"l'échappement se produit uniquement dans Django pendant le rendu du modèle. Par conséquent, il n'y a pas besoin d'un paysage - vous dites simplement au moteur de modèle de ne pas s'échapper. soit {{context_var | safe}} ou {% autoescape off%} {{context_var}} { % endautoescape%} "
la source
J'ai trouvé une bonne fonction sur: http://snippets.dzone.com/posts/show/4569
la source
 
qui devrait décoder de la même manière que 
et
.Si quelqu'un cherche un moyen simple de le faire via les modèles django, vous pouvez toujours utiliser des filtres comme celui-ci:
J'ai eu des données provenant d'un fournisseur et tout ce que j'ai publié avait des balises html réellement écrites sur la page rendue comme si vous regardiez la source. Le code ci-dessus m'a beaucoup aidé. J'espère que cela aide les autres.
À votre santé!!
la source
Même si c'est une question très ancienne, cela peut fonctionner.
Django 1.5.5
la source
"��"
. Puis après un autreresult.encode('utf-16', 'surrogatepass').decode('utf-16')
, j'ai enfin récupéré l'original.J'ai trouvé ça dans le code source de Cheetah ( ici )
Je ne sais pas pourquoi ils inversent la liste, je pense que cela a à voir avec la façon dont ils encodent, donc avec vous, cela n'a peut-être pas besoin d'être inversé. De plus, si j'étais vous, je changerais htmlCodes en une liste de tuples plutôt qu'une liste de listes ... cela se passe dans ma bibliothèque :)
J'ai remarqué que votre titre demandait également un encodage, voici donc la fonction d'encodage de Cheetah.
la source
Vous pouvez également utiliser django.utils.html.escape
la source
Vous trouverez ci-dessous une fonction python qui utilise module
htmlentitydefs
. Ce n'est pas parfait. La version de cehtmlentitydefs
que j'ai est incomplète et elle suppose que toutes les entités décodent en un point de code, ce qui est faux pour des entités comme≂̸
:http://www.w3.org/TR/html5/named-character-references.html
Avec ces mises en garde cependant, voici le code.
la source
C'est la solution la plus simple à ce problème -
À partir de cette page .
la source
En recherchant la solution la plus simple de cette question dans Django et Python, j'ai trouvé que vous pouvez utiliser leurs fonctions intégrées pour échapper au code html / unescape.
Exemple
J'ai enregistré votre code html dans
scraped_html
etclean_html
:Django
Vous avez besoin de Django> = 1.0
unescape
Pour échapper à votre code html, vous pouvez utiliser django.utils.text.unescape_entities qui:
échapper
Pour échapper à votre code html propre, vous pouvez utiliser django.utils.html.escape qui:
Python
Vous avez besoin de Python> = 3.4
unescape
Pour échapper à votre code html gratté, vous pouvez utiliser html.unescape qui:
échapper
Pour échapper à votre code html propre, vous pouvez utiliser html.escape qui:
la source