Angesichts des Django-Anwendungsfalls gibt es zwei Antworten darauf. Hier ist seine django.utils.html.escape
Funktion als Referenz:
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("'", '''))
Um dies umzukehren, sollte die in Jakes Antwort beschriebene Cheetah-Funktion funktionieren, es fehlt jedoch das einfache Anführungszeichen. Diese Version enthält ein aktualisiertes Tupel, wobei die Reihenfolge des Ersetzens umgekehrt ist, um symmetrische Probleme zu vermeiden:
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)
Dies ist jedoch keine allgemeine Lösung; Es ist nur für Zeichenfolgen geeignet, die mit codiert sind django.utils.html.escape
. Generell ist es eine gute Idee, sich an die Standardbibliothek zu halten:
# 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)
Als Vorschlag: Es kann sinnvoller sein, den HTML-Code nicht in Ihrer Datenbank zu speichern. Es lohnt sich, wenn möglich zu versuchen, uneingeschränkte Ergebnisse von BeautifulSoup zurückzugewinnen und diesen Prozess insgesamt zu vermeiden.
Bei Django erfolgt das Escape nur während des Renderns von Vorlagen. Um ein Entkommen zu verhindern, weisen Sie die Template-Engine an, nicht aus Ihrer Saite zu entkommen. Verwenden Sie dazu eine der folgenden Optionen in Ihrer Vorlage:
{{ context_var|safe }}
{% autoescape off %}
{{ context_var }}
{% endautoescape %}
html.parser.HTMLParser().unescape()
ist in 3.5 veraltet. Verwenden Siehtml.unescape()
stattdessen.Mit der Standardbibliothek:
HTML Escape
HTML Unescape
quelle
HTMLParser
muss in eine Unterklasse eingeteilt werden, erklärt werden, was mit allen Teilen eines Objekts zu tun ist, dem es zugeführt wird, und dann das zu analysierende Objekt zugeführt werden, wie hier gezeigt . Außerdem möchten Sie weiterhin dasname2codepoint
Diktat verwenden, um jede HTML-Identität in das tatsächliche Zeichen zu konvertieren, das sie darstellt.HTMLParser
konnten nicht wie gewünscht funktionieren, wenn wir eine HTML-Entität einfügen . Vielleicht sollte ich umbenennenhtmlparser
,_htmlparser
um es auszublenden, und dieunescape
Methode nur als Hilfsfunktion aussetzen .from html import unescape
stattdessenFür die HTML-Codierung gibt es cgi.escape aus der Standardbibliothek:
Für die HTML-Dekodierung verwende ich Folgendes:
Für etwas komplizierteres benutze ich BeautifulSoup.
quelle
Verwenden Sie Daniels Lösung, wenn der Satz codierter Zeichen relativ begrenzt ist. Verwenden Sie andernfalls eine der zahlreichen HTML-Parsing-Bibliotheken.
Ich mag BeautifulSoup, weil es mit fehlerhaftem XML / HTML umgehen kann:
http://www.crummy.com/software/BeautifulSoup/
Für Ihre Frage gibt es ein Beispiel in ihrer Dokumentation
quelle
from bs4 import BeautifulSoup
BeautifulSoup("Sacré bleu!").contents[0]
In Python 3.4+:
quelle
Unten auf dieser Seite im Python-Wiki gibt es mindestens zwei Optionen, um HTML zu "entschlüsseln".
quelle
Daniels Kommentar als Antwort:
"Escapeing tritt nur in Django während des Renderns von Vorlagen auf. Daher ist kein Unescape erforderlich. Sie weisen die Template-Engine lediglich an, nicht zu entkommen. Entweder {{context_var | safe}} oder {% autoescape off%} {{context_var}} { % endautoescape%} "
quelle
Ich habe eine gute Funktion gefunden unter: http://snippets.dzone.com/posts/show/4569
quelle
 
was auf das gleiche wie 
und dekodiert werden soll
.Wenn jemand nach einer einfachen Möglichkeit sucht, dies über die Django-Vorlagen zu tun, können Sie immer Filter wie diesen verwenden:
Ich hatte einige Daten von einem Anbieter und alles, was ich gepostet habe, hatte HTML-Tags, die tatsächlich auf die gerenderte Seite geschrieben wurden, als ob Sie sich die Quelle ansehen würden. Der obige Code hat mir sehr geholfen. Hoffe das hilft anderen.
Prost!!
quelle
Auch wenn dies eine sehr alte Frage ist, kann dies funktionieren.
Django 1.5.5
quelle
"��"
. Dann nach dem anderenresult.encode('utf-16', 'surrogatepass').decode('utf-16')
hatte ich endlich das Original zurück.Ich fand dies im Cheetah-Quellcode ( hier )
Ich bin mir nicht sicher, warum sie die Liste umkehren. Ich denke, das hängt mit der Art und Weise zusammen, wie sie codieren. Bei Ihnen muss sie möglicherweise nicht rückgängig gemacht werden. Auch wenn ich du wäre, würde ich htmlCodes ändern, um eine Liste von Tupeln zu sein, anstatt eine Liste von Listen ... das geht aber in meiner Bibliothek :)
Ich habe bemerkt, dass Ihr Titel auch nach Codierung gefragt wurde. Hier ist die Codierungsfunktion von Cheetah.
quelle
Sie können auch django.utils.html.escape verwenden
quelle
Unten finden Sie eine Python-Funktion, die ein Modul verwendet
htmlentitydefs
. Es ist nicht perfekt. Die Versionhtmlentitydefs
, die ich habe, ist unvollständig und es wird davon ausgegangen, dass alle Entitäten zu einem Codepunkt dekodieren, was für Entitäten wie≂̸
:http://www.w3.org/TR/html5/named-character-references.html
Mit diesen Einschränkungen ist hier der Code.
quelle
Dies ist die einfachste Lösung für dieses Problem -
Von dieser Seite .
quelle
Bei der Suche nach der einfachsten Lösung dieser Frage in Django und Python habe ich festgestellt, dass Sie integrierte Funktionen verwenden können, um HTML-Code zu maskieren / zu entfernen.
Beispiel
Ich habe Ihren HTML-Code gespeichert in
scraped_html
undclean_html
:Django
Sie benötigen Django> = 1.0
entkommen
Um unescape Ihre geschabt HTML - Code können Sie verwenden django.utils.text.unescape_entities , die:
Flucht
Um Ihrem sauberen HTML-Code zu entkommen, können Sie django.utils.html.escape verwenden, das:
Python
Sie benötigen Python> = 3.4
entkommen
Um Ihren abgekratzten HTML-Code zu entfernen, können Sie html.unescape verwenden, das:
Flucht
Um Ihrem sauberen HTML-Code zu entkommen, können Sie html.escape verwenden, das:
quelle