139 votes

Comment puis-je effectuer décodage/codage HTML avec Python/Django ?

J'ai une chaîne html codé:

<img class="size-medium wp-image-113" 
  style="margin-left: 15px;" title="su1" 
  src="http://blah.org/wp-content/uploads/2008/10/su1-300x194.jpg" 
  alt="" width="300" height="194" />

Je veux changer:

<img class="size-medium wp-image-113" style="margin-left: 15px;" 
  title="su1" src="http://blah.org/wp-content/uploads/2008/10/su1-300x194.jpg" 
  alt="" width="300" height="194" />

Je veux pour vous inscrire au format HTML afin qu'il soit rendu comme une image par le navigateur au lieu d'être affiché sous forme de texte.

J'ai trouvé comment le faire en C# mais pas en Python. Quelqu'un peut-il m'aider?

Merci.

Edit: Quelqu'un a demandé pourquoi mon chaînes de caractères sont stockées comme ça. C'est parce que je suis en utilisant un web-grattage outil qui "scanne" d'une page web et obtient un certain contenu. L'outil (BeautifulSoup) retourne la chaîne de caractères dans ce format.

Liées

134voto

Daniel Naab Points 9857

Compte tenu de la Django de cas d'utilisation, il y a deux réponses à cela. Voici son django.utils.html.escape de la fonction, pour la référence:

def escape(html):
    """Returns the given HTML with ampersands, quotes and carets encoded."""
    return mark_safe(force_unicode(html).replace('&', '&amp;').replace('<', '&l
t;').replace('>', '&gt;').replace('"', '&quot;').replace("'", '&#39;'))

Pour éviter cela, le Guépard fonction décrite dans de Jake réponse devrait fonctionner, mais est absent de la simple citation. Cette version inclut une mise à jour d'un tuple avec la commande de remplacement inversé pour éviter symétrique problèmes:

def html_decode(s):
    """
    Returns the ASCII decoded version of the given HTML string. This does
    NOT remove normal HTML tags like <p>.
    """
    for code in htmlCodes = (
            ("'", '&#39;'),
            ('"', '&quot;'),
            ('>', '&gt;'),
            ('<', '&lt;'),
            ('&', '&amp;')
        ):
        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 est seulement approprié pour les chaînes codées avec django.utils.html.escape. Plus généralement, c'est une bonne idée de coller avec 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)

Une suggestion: il peut faire plus de sens de stocker le code HTML sans échappement dans votre base de données. Il serait intéressant de regarder dans l'obtention de sans échappement résultats de BeautifulSoup, si possible, et d'éviter ce processus.

Avec Django, échappant se produit uniquement lors de modèle de rendu; aussi, pour éviter échapper que vous venez de dire le moteur de template de ne pas échapper à votre chaîne. Pour ce faire, utilisez l'une de ces options dans votre template:

{{ context_var|safe }}
{% autoescape off %}
    {{ context_var }}
{% endautoescape %}

127voto

TonySeek Points 557

Évasion de HTML

Unescape HTML

80voto

user26294 Points 1982

Pour le codage html, il n’y a cgi.escape de la bibliothèque standard :

Pour le décodage de html, j’ai utiliser la syntaxe suivante :

Pour quoi que ce soit plus compliqué, j’utilise BeautifulSoup.

20voto

vincent Points 2014

L'utilisation de daniel solution si le jeu de caractères codés est relativement restreinte. Sinon, utilisez l'un des nombreux HTML-bibliothèques d'analyse.

J'aime BeautifulSoup, car il peut traiter la malformation de XML/HTML :

http://www.crummy.com/software/BeautifulSoup/

pour votre question, il y a un exemple dans leur documentation

from BeautifulSoup import BeautifulStoneSoup
BeautifulStoneSoup("Sacr&eacute; bl&#101;u!", 
                   convertEntities=BeautifulStoneSoup.HTML_ENTITIES).contents[0]
# u'Sacr\xe9 bleu!'

8voto

zgoda Points 8549

Voir au bas de cette page sur le wiki de Python, il y a au moins 2 options à « décoder » html.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X