问题:在Python中转义HTML的最简单方法是什么?
cgi.escape似乎是一种可能的选择。它运作良好吗?有什么更好的东西吗?
回答 0
cgi.escape
很好 它逃脱了:
<
至<
>
至>
&
至&
对于所有HTML而言,这就足够了。
编辑:如果您有非ASCII字符,您还想转义,以便包含在使用不同编码的另一个编码文档中,如Craig所说,只需使用:
data.encode('ascii', 'xmlcharrefreplace')
不要忘了解码data
到unicode
第一,使用任何编码它编码的。
但是根据我的经验,如果您unicode
从头开始一直都在工作,那么这种编码是没有用的。只需在文档头中指定的编码末尾进行编码(utf-8
以实现最大兼容性)。
例:
>>> cgi.escape(u'<a>bá</a>').encode('ascii', 'xmlcharrefreplace')
'<a>bá</a>
另外值得一提的(感谢Greg)是额外的cgi.escape
。将其设置为时True
,cgi.escape
还转义双引号字符("
),因此您可以在XML / HTML属性中使用结果值。
编辑:请注意,cgi.escape已在Python 3.2中弃用,转而使用html.escape
,它的功能相同,但quote
默认情况下为True。
回答 1
在Python 3.2中,新 html
,引入模块,该模块用于从HTML标记转义保留字符。
它具有一个功能escape()
:
>>> import html
>>> html.escape('x > 2 && x < 7 single quote: \' double quote: "')
'x > 2 && x < 7 single quote: ' double quote: "'
回答 2
如果您希望在URL中转义HTML:
这可能不是OP想要的(问题并没有明确指出转义是在哪种上下文中使用的),但是Python的本机库urllib有一种方法可以转义需要安全包含在URL中的HTML实体。
以下是一个示例:
#!/usr/bin/python
from urllib import quote
x = '+<>^&'
print quote(x) # prints '%2B%3C%3E%5E%26'
回答 3
还有出色的markupsafe软件包。
>>> from markupsafe import Markup, escape
>>> escape("<script>alert(document.cookie);</script>")
Markup(u'<script>alert(document.cookie);</script>')
该markupsafe
程序包经过精心设计,并且可能是逃避转义的最通用,最Python化的方法,恕我直言,因为:
- return(
Markup
)是从unicode派生的类(即isinstance(escape('str'), unicode) == True
- 它可以正确处理unicode输入
- 它适用于Python(2.6、2.7、3.3和pypy)
- 它尊重对象(即具有
__html__
属性的对象)和模板重载(__html_format__
)的自定义方法。
回答 4
cgi.escape
从转义HTML标记和字符实体的有限意义上讲,应该可以逃脱HTML。
但是,您可能还必须考虑编码问题:如果要引用的HTML在特定的编码中包含非ASCII字符,那么还必须注意在引用时要合理地表示这些字符。也许您可以将它们转换为实体。否则,您应确保在“源” HTML和嵌入页面之间进行正确的编码转换,以避免损坏非ASCII字符。
回答 5
没有库,纯python,可以安全地将文本转义为html文本:
text.replace('&', '&').replace('>', '>').replace('<', '<'
).encode('ascii', 'xmlcharrefreplace')
回答 6
cgi.escape
扩展的
此版本进行了改进cgi.escape
。它还保留空格和换行符。返回一个unicode
字符串。
def escape_html(text):
"""escape strings for display in HTML"""
return cgi.escape(text, quote=True).\
replace(u'\n', u'<br />').\
replace(u'\t', u' ').\
replace(u' ', u' ')
例如
>>> escape_html('<foo>\nfoo\t"bar"')
u'<foo><br />foo "bar"'
回答 7
不是最简单的方法,但仍然很简单。与cgi.escape模块的主要区别-如果您已经&
在文本中使用了它,它仍然可以正常工作。从评论中可以看到:
cgi.escape版本
def 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.'''
s = s.replace("&", "&") # Must be done first!
s = s.replace("<", "<")
s = s.replace(">", ">")
if quote:
s = s.replace('"', """)
return s
正则表达式版本
QUOTE_PATTERN = r"""([&<>"'])(?!(amp|lt|gt|quot|#39);)"""
def escape(word):
"""
Replaces special characters <>&"' to HTML-safe sequences.
With attention to already escaped characters.
"""
replace_with = {
'<': '>',
'>': '<',
'&': '&',
'"': '"', # should be escaped in attributes
"'": ''' # should be escaped in attributes
}
quote_pattern = re.compile(QUOTE_PATTERN)
return re.sub(quote_pattern, lambda x: replace_with[x.group(0)], word)
回答 8
对于Python 2.7中的旧代码,可以通过BeautifulSoup4做到:
>>> bs4.dammit import EntitySubstitution
>>> esub = EntitySubstitution()
>>> esub.substitute_html("r&d")
'r&d'