在Python中最简单的HTML转义方法是什么?

183 投票
9 回答
169124 浏览
提问于 2025-04-15 12:35

cgi.escape 看起来是一个可行的选择。它好用吗?有没有什么更好的方法?

9 个回答

12

如果你想在网址中处理HTML:

这可能不是提问者想要的(因为问题没有明确说明处理的具体场景),但是Python自带的库urllib有一个方法,可以安全地处理需要放在网址中的HTML实体。

下面是一个例子:

#!/usr/bin/python
from urllib import quote

x = '+<>^&'
print quote(x) # prints '%2B%3C%3E%5E%26'

在这里查看文档

176

在Python 3.2版本中,新增了一个叫做 html 的模块,这个模块主要用来处理HTML中的一些特殊字符。

这个模块里有一个函数叫做 escape()

>>> import html
>>> html.escape('x > 2 && x < 7 single quote: \' double quote: "')
'x &gt; 2 &amp;&amp; x &lt; 7 single quote: &#x27; double quote: &quot;'
204

html.escape 现在是正确的选择,以前在 Python 3.2 之前用的是 cgi.escape。这个方法可以处理以下内容:

  • < 会变成 &lt;
  • > 会变成 &gt;
  • & 会变成 &amp;

这些处理对于所有 HTML 来说已经足够了。

补充说明:如果你还有一些非 ASCII 字符需要处理,比如在另一个使用不同编码的文档中使用,像 Craig 所说的,可以直接使用:

data.encode('ascii', 'xmlcharrefreplace')

记得先把 data 解码成 unicode,用你原本编码时用的编码方式。

不过根据我的经验,如果你从一开始就一直使用 unicode,那么这种编码方式其实没什么用。最后只需要按照文档头部指定的编码(比如 utf-8,这样兼容性最好)进行编码就可以了。

举个例子:

>>> cgi.escape(u'<a>bá</a>').encode('ascii', 'xmlcharrefreplace')
'&lt;a&gt;b&#225;&lt;/a&gt;

还有一点值得注意(感谢 Greg),就是 cgi.escape 还有一个额外的 quote 参数。如果把它设置为 True,那么 cgi.escape 还会处理双引号字符("),这样你就可以把结果用在 XML/HTML 的属性中。

补充说明:注意在 Python 3.2 中,cgi.escape 已经被弃用了,取而代之的是 html.escape,它的功能是一样的,只不过 quote 的默认值是 True。

撰写回答