Dado el caso de uso de Django, hay dos respuestas a esto. Aquí está su django.utils.html.escape
función, para referencia:
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("'", '''))
Para revertir esto, la función Cheetah descrita en la respuesta de Jake debería funcionar, pero le falta la comilla simple. Esta versión incluye una tupla actualizada, con el orden de reemplazo invertido para evitar problemas simétricos:
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)
Esto, sin embargo, no es una solución general; solo es apropiado para cadenas codificadas con django.utils.html.escape
. En términos más generales, es una buena idea seguir con la biblioteca estándar:
# 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)
Como sugerencia: puede tener más sentido almacenar el HTML sin escape en su base de datos. Merecería la pena estudiar para obtener resultados sin escape de BeautifulSoup, si es posible, y evitar este proceso por completo.
Con Django, el escape solo ocurre durante la representación de la plantilla; así que para evitar escapar, simplemente dile al motor de plantillas que no escape de tu cadena. Para hacer eso, use una de estas opciones en su plantilla:
{{ context_var|safe }}
{% autoescape off %}
{{ context_var }}
{% endautoescape %}
html.parser.HTMLParser().unescape()
está en desuso en 3.5. Usar en suhtml.unescape()
lugar.Con la biblioteca estándar:
HTML Escape
HTML Unescape
fuente
HTMLParser
necesita subclasificar, decir qué hacer con todas las partes de cualquier objeto que se alimente y luego alimentar el objeto a analizar, como se ve aquí . Además, aún querrá usar elname2codepoint
dict para convertir cada identidad html al carácter real que representa.HTMLParser
no podría funcionar como quisiéramos si le pusiéramos una entidad HTML. Tal vez debería cambiarle el nombrehtmlparser
para_htmlparser
ocultarlo, y solo exponer elunescape
método para que sea como una función auxiliar.from html import unescape
en su lugarPara la codificación html, hay cgi.escape de la biblioteca estándar:
Para la decodificación html, uso lo siguiente:
Para cualquier cosa más complicada, uso BeautifulSoup.
fuente
Use la solución de daniel si el conjunto de caracteres codificados está relativamente restringido. De lo contrario, use una de las numerosas bibliotecas de análisis HTML.
Me gusta BeautifulSoup porque puede manejar XML / HTML con formato incorrecto:
http://www.crummy.com/software/BeautifulSoup/
para su pregunta, hay un ejemplo en su documentación
fuente
from bs4 import BeautifulSoup
BeautifulSoup("Sacré bleu!").contents[0]
En Python 3.4+:
fuente
Vea al final de esta página en Python wiki , hay al menos 2 opciones para "dejar de escapar" html.
fuente
El comentario de Daniel como respuesta:
"el escape solo ocurre en Django durante la representación de la plantilla. Por lo tanto, no hay necesidad de un escape; simplemente le dice al motor de plantillas que no escape. {{context_var | safe}} o {% autoescape off%} {{context_var}} { % endautoescape%} "
fuente
Encontré una buena función en: http://snippets.dzone.com/posts/show/4569
fuente
 
que debería decodificar a la misma cosa que 
y
.Si alguien está buscando una manera simple de hacerlo a través de las plantillas de django, siempre puede usar filtros como este:
Recibí algunos datos de un proveedor y todo lo que publiqué tenía etiquetas html realmente escritas en la página representada como si estuviera mirando la fuente. El código anterior me ayudó mucho. Espero que esto ayude a otros.
¡¡Salud!!
fuente
Aunque esta es una pregunta muy antigua, puede funcionar.
Django 1.5.5
fuente
"��"
. Luego, después de otroresult.encode('utf-16', 'surrogatepass').decode('utf-16')
, finalmente tuve la espalda original.Encontré esto en el código fuente de Cheetah ( aquí )
No estoy seguro de por qué invierten la lista, creo que tiene que ver con la forma en que codifican, por lo que con usted puede que no sea necesario revertirla. Además, si fuera usted, cambiaría htmlCodes para que sea una lista de tuplas en lugar de una lista de listas ... aunque esto va en mi biblioteca :)
Noté que tu título también pedía codificación, así que aquí está la función de codificación de Cheetah.
fuente
También puedes usar django.utils.html.escape
fuente
A continuación se muestra una función de Python que usa el módulo
htmlentitydefs
. No es perfecto La versiónhtmlentitydefs
que tengo es incompleta y supone que todas las entidades decodifican en un punto de código, lo cual es incorrecto para entidades como≂̸
:http://www.w3.org/TR/html5/named-character-references.html
Sin embargo, con esas advertencias, aquí está el código.
fuente
Esta es la solución más fácil para este problema:
De esta página .
fuente
Al buscar la solución más simple de esta pregunta en Django y Python, descubrí que puedes usar sus funciones incorporadas para escapar / escapar del código html.
Ejemplo
Guarde su código html
scraped_html
yclean_html
:Django
Necesitas Django> = 1.0
escapar
Para deshacerse de su código html raspado, puede usar django.utils.text.unescape_entities que:
escapar
Para escapar de su código html limpio, puede usar django.utils.html.escape que:
Pitón
Necesitas Python> = 3.4
escapar
Para deshacerse de su código html raspado, puede usar html.unescape que:
escapar
Para escapar de su código html limpio, puede usar html.escape que:
fuente