当前位置:  开发笔记 > 编程语言 > 正文

如何使用Python/Django执行HTML解码/编码?

如何解决《如何使用Python/Django执行HTML解码/编码?》经验,为你挑选了8个好方法。

我有一个html编码的字符串:

'''<img class="size-medium wp-image-113"\
 style="margin-left: 15px;" title="su1"\
 src="https://img.devbox.cn/3cccf/16086/243/0ab2d201ea5dc980.png"\
 alt="" ''

我想将其改为:

 

我希望将其注册为HTML,以便浏览器将其呈现为图像,而不是显示为文本.

我已经在C#中找到了如何做到这一点,但在Python中却没有.有人可以帮我吗?

谢谢.

编辑:有人问为什么我的字符串存储就像那样.这是因为我正在使用网络抓取工具"扫描"网页并从中获取某些内容.该工具(BeautifulSoup)以该格式返回字符串.

有关

在Python中将XML/HTML实体转换为Unicode字符串

Daniel Naab.. 112

鉴于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的答案中描述的猎豹功能应该有效,但缺少单引号.此版本包含更新的元组,更换顺序颠倒以避免对称问题:

def html_decode(s):
    """
    Returns the ASCII decoded version of the given HTML string. This does
    NOT remove normal HTML tags like 

. """ 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 %}

我认为转义只发生在模板渲染过程中的Django中.因此,不需要unescape - 你只是告诉模板引擎不要逃脱.{{context_var | safe}}或{%autoescape off%} {{context_var}} {%endautoescape%} (12认同)

与django.utils.html.escape没有对立面吗? (4认同)

@Daniel:请将您的评论更改为答案,以便我可以投票!|安全正是我(我相信其他人)在回答这个问题时所寻求的. (3认同)


Jiangge Zhan.. 110

使用标准库:

HTML Escape

try:
    from html import escape  # python 3.x
except ImportError:
    from cgi import escape  # python 2.x

print(escape("<"))

HTML Unescape

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(">"))

我认为这是最直接的,"包括电池"和正确的答案.我不知道为什么人们投票给那些Django/Cheetah的事情. (12认同)

对于2015年的说明,HTMLParser.unescape在py 3.4中已弃用,在3.5中已删除.使用`from html import unescape`代替 (3认同)

请注意,这不会处理像德语元音("Ü")这样的特殊字符 (2认同)


user26294.. 80

对于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.



1> Daniel Naab..:

鉴于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的答案中描述的猎豹功能应该有效,但缺少单引号.此版本包含更新的元组,更换顺序颠倒以避免对称问题:

def html_decode(s):
    """
    Returns the ASCII decoded version of the given HTML string. This does
    NOT remove normal HTML tags like 

. """ 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 %}


我认为转义只发生在模板渲染过程中的Django中.因此,不需要unescape - 你只是告诉模板引擎不要逃脱.{{context_var | safe}}或{%autoescape off%} {{context_var}} {%endautoescape%}
与django.utils.html.escape没有对立面吗?
@Daniel:请将您的评论更改为答案,以便我可以投票!|安全正是我(我相信其他人)在回答这个问题时所寻求的.

2> Jiangge Zhan..:

使用标准库:

HTML Escape

try:
    from html import escape  # python 3.x
except ImportError:
    from cgi import escape  # python 2.x

print(escape("<"))

HTML Unescape

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(">"))


我认为这是最直接的,"包括电池"和正确的答案.我不知道为什么人们投票给那些Django/Cheetah的事情.
对于2015年的说明,HTMLParser.unescape在py 3.4中已弃用,在3.5中已删除.使用`from html import unescape`代替
请注意,这不会处理像德语元音("Ü")这样的特殊字符

3> user26294..:

对于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.



4> vincent..:

如果编码字符集相对受限,请使用daniel的解决方案.否则,请使用众多HTML解析库中的一个.

我喜欢BeautifulSoup,因为它可以处理格式错误的XML/HTML:

http://www.crummy.com/software/BeautifulSoup/

对于你的问题,他们的文档中有一个例子

from BeautifulSoup import BeautifulStoneSoup
BeautifulStoneSoup("Sacré bleu!", 
                   convertEntities=BeautifulStoneSoup.HTML_ENTITIES).contents[0]
# u'Sacr\xe9 bleu!'



5> Collin Ander..:

在Python 3.4+中:

import html

html.unescape(your_string)



6> zgoda..:

请参阅本页底部的Python wiki,"unes​​cape"html至少有2个选项.



7> dfrankow..:

丹尼尔的评论作为答案:

"转义只发生在Django模板渲染过程中.因此,不需要unescape - 你只需告诉模板引擎不要逃脱.{{context_var | safe}}或{%autoescape off%} {{context_var}} { %endautoescape%}"



8> slowkvant..:

我发现了一个很好的功能:http://snippets.dzone.com/posts/show/4569

def decodeHtmlentities(string):
    import re
    entity_re = re.compile("&(#?)(\d{1,5}|\w{1,8});")

    def substitute_entity(match):
        from htmlentitydefs import name2codepoint as n2cp
        ent = match.group(2)
        if match.group(1) == "#":
            return unichr(int(ent))
        else:
            cp = n2cp.get(ent)

            if cp:
                return unichr(cp)
            else:
                return match.group()

    return entity_re.subn(substitute_entity, string)[0]

推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有