Учитывая вариант использования Django, на этот вопрос есть два ответа. Вот его django.utils.html.escape
функция для справки:
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("'", '''))
Чтобы изменить это, функция Cheetah, описанная в ответе Джейка, должна работать, но в ней отсутствует одинарная кавычка. Эта версия включает обновленный кортеж с обратным порядком замены, чтобы избежать симметричных проблем:
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)
Однако это не общее решение; он подходит только для строк, закодированных с помощью django.utils.html.escape
. В более общем плане рекомендуется придерживаться стандартной библиотеки:
# 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)
В качестве предложения: может иметь смысл хранить HTML без экранирования в вашей базе данных. Если возможно, стоит подумать о том, чтобы получить обратно неэкранированные результаты из BeautifulSoup, и вообще избежать этого процесса.
В Django экранирование происходит только во время отрисовки шаблона; поэтому, чтобы предотвратить побег, вы просто скажете движку шаблонов не экранировать вашу строку. Для этого используйте в своем шаблоне одну из следующих опций:
{{ context_var|safe }}
{% autoescape off %}
{{ context_var }}
{% endautoescape %}
html.parser.HTMLParser().unescape()
устарел в 3.5.html.unescape()
Вместо этого используйте .Со стандартной библиотекой:
HTML Escape
HTML Unescape
источник
HTMLParser
необходимо разделить на подклассы, указать, что делать со всеми частями любого объекта, который он загружает, а затем передать объект для анализа, как показано здесь . Кроме того, вы все равно захотите использоватьname2codepoint
dict для преобразования каждого идентификатора html в фактический символ, который он представляет.HTMLParser
не могли работать так, как мы хотели, если бы мы поместили в них HTML-сущность. Может быть , я должен переименовать ,htmlparser
чтобы_htmlparser
для того , чтобы скрыть его, и только выставитьunescape
метод , чтобы быть точно так же как вспомогательная функция.from html import unescape
вместоДля кодировки html есть cgi.escape из стандартной библиотеки:
Для декодирования html я использую следующее:
Для чего-то более сложного я использую BeautifulSoup.
источник
Используйте решение Дэниела, если набор закодированных символов относительно ограничен. В противном случае используйте одну из многочисленных библиотек анализа HTML.
Мне нравится BeautifulSoup, потому что он может обрабатывать искаженный XML / HTML:
http://www.crummy.com/software/BeautifulSoup/
для вашего вопроса в их документации есть пример
источник
from bs4 import BeautifulSoup
BeautifulSoup("Sacré bleu!").contents[0]
В Python 3.4+:
источник
См. Внизу этой страницы в вики Python , есть как минимум 2 варианта "отключить экранирование" html.
источник
Комментарий Даниила в качестве ответа:
"экранирование происходит только в Django во время рендеринга шаблона. Следовательно, в этом нет необходимости - вы просто указываете движку шаблонов не экранировать. либо {{context_var | safe}}, либо {% autoescape off%} {{context_var}} { % endautoescape%} "
источник
Я нашел прекрасную функцию по адресу: http://snippets.dzone.com/posts/show/4569
источник
 
что должно декодировать то же самое, что 
и
.Если кто-то ищет простой способ сделать это с помощью шаблонов django, вы всегда можете использовать такие фильтры:
У меня были данные от поставщика, и все, что я опубликовал, содержало html-теги, фактически написанные на отображаемой странице, как если бы вы смотрели на источник. Приведенный выше код мне очень помог. Надеюсь, это поможет другим.
Ура !!
источник
Хотя это действительно старый вопрос, он может сработать.
Django 1.5.5
источник
"��"
. Затем, за другимresult.encode('utf-16', 'surrogatepass').decode('utf-16')
, я наконец получил обратно оригинал.Я нашел это в исходном коде Cheetah ( здесь )
Не уверен, почему они меняют список, я думаю, это связано с тем, как они кодируют, поэтому с вами, возможно, нет необходимости в обратном. Также, если бы я был на вашем месте, я бы изменил htmlCodes на список кортежей, а не на список списков ... хотя это происходит в моей библиотеке :)
Я заметил, что ваш заголовок тоже просил кодировать, так что вот функция кодирования Cheetah.
источник
Вы также можете использовать django.utils.html.escape
источник
Ниже представлена функция Python, использующая модуль
htmlentitydefs
. Это не идеально. Версия,htmlentitydefs
которая у меня есть, является неполной, и она предполагает, что все объекты декодируются в одну кодовую точку, что неверно для таких объектов, как≂̸
:http://www.w3.org/TR/html5/named-character-references.html
С учетом этих предостережений, вот код.
источник
Это самое простое решение этой проблемы -
С этой страницы .
источник
В поисках простейшего решения этого вопроса в Django и Python я обнаружил, что вы можете использовать встроенные их функции для экранирования / отмены экранирования html-кода.
пример
Я сохранил ваш html-код
scraped_html
иclean_html
:Джанго
Вам нужен Django> = 1.0
экранирования в
Чтобы отменить экранирование вашего очищенного html-кода, вы можете использовать django.utils.text.unescape_entities, который:
побег
Чтобы избежать вашего чистого html-кода, вы можете использовать django.utils.html.escape, который:
питон
Вам нужен Python> = 3.4
экранирования в
Чтобы отменить экранирование вашего очищенного html-кода, вы можете использовать html.unescape, который:
побег
Чтобы избежать вашего чистого html-кода, вы можете использовать html.escape, который:
источник