[python] Python / Django를 사용하여 HTML 디코딩 / 인코딩을 어떻게 수행합니까?

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('&', '&amp;').replace('<', '&l
t;').replace('>', '&gt;').replace('"', '&quot;').replace("'", '&#39;'))

이것을 뒤집으려면 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 = (
            ("'", '&#39;'),
            ('"', '&quot;'),
            ('>', '&gt;'),
            ('<', '&lt;'),
            ('&', '&amp;')
        )
    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("&gt;"))

답변

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&eacute; bl&#101;u!",
                   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 %} “