HTML로 인코딩 된 문자열이 있습니다.
'''<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" />'''
나는 그것을 다음과 같이 바꾸고 싶다 :
<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" />
텍스트로 표시되는 대신 브라우저에서 이미지로 렌더링되도록 HTML로 등록하고 싶습니다.
문자열은이라는 웹 스크래핑 도구를 사용하기 때문에 BeautifulSoup
웹 페이지를 “스캔”하고 특정 내용을 가져온 다음 해당 형식으로 문자열을 반환합니다.
C # 에서는 이것을 수행하는 방법을 찾았 지만 파이썬 에서는 그렇지 않습니다 . 누군가 나를 도울 수 있습니까?
관련
답변
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("'", '''))
이것을 뒤집으려면 Jake의 답변에 설명 된 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 탈출
try: from html import escape # python 3.x except ImportError: from cgi import escape # python 2.x print(escape("<"))
-
HTML 이스케이프
try: from html import unescape # python 3.4+ except ImportError: try: from html.parser import HTMLParser # python 3.x (<3.4) except ImportError: from HTMLParser import HTMLParser # python 2.x unescape = HTMLParser().unescape print(unescape(">"))
답변
html 인코딩의 경우 표준 라이브러리 에서 cgi.escape 가 있습니다.
>> help(cgi.escape)
cgi.escape = escape(s, quote=None)
Replace special characters "&", "<" and ">" to HTML-safe sequences.
If the optional flag quote is true, the quotation mark character (")
is also translated.
html 디코딩의 경우 다음을 사용합니다.
import re
from htmlentitydefs import name2codepoint
# for some reason, python 2.5.2 doesn't have this one (apostrophe)
name2codepoint['#39'] = 39
def unescape(s):
"unescape HTML code refs; c.f. http://wiki.python.org/moin/EscapingHtml"
return re.sub('&(%s);' % '|'.join(name2codepoint),
lambda m: unichr(name2codepoint[m.group(1)]), s)
더 복잡한 것은 BeautifulSoup을 사용합니다.
답변
인코딩 된 문자 세트가 상대적으로 제한된 경우 다니엘의 솔루션을 사용하십시오. 그렇지 않으면 수많은 HTML 구문 분석 라이브러리 중 하나를 사용하십시오.
형식이 잘못된 XML / HTML을 처리 할 수 있기 때문에 BeautifulSoup을 좋아합니다.
http://www.crummy.com/software/BeautifulSoup/
from BeautifulSoup import BeautifulStoneSoup
BeautifulStoneSoup("Sacré bleu!",
convertEntities=BeautifulStoneSoup.HTML_ENTITIES).contents[0]
# u'Sacr\xe9 bleu!'
답변
Python 3.4 이상에서 :
import html
html.unescape(your_string)
답변
이 페이지 의 맨 아래에 있는 Python wiki를 참조하십시오 . html을 “이스케이프 제거”하는 옵션은 2 가지 이상 있습니다.
답변
답변으로 다니엘의 의견 :
“이스케이프는 템플릿 렌더링 중에 Django에서만 발생합니다. 따라서 이스케이프 처리 할 필요가 없습니다. 템플릿 엔진이 이스케이프하지 않도록 지시하면됩니다. {{context_var | safe}} 또는 {% autoescape off %} {{context_var}} { endautoescape %} “