如何在Python中转义HTML?

7 投票
5 回答
16766 浏览
提问于 2025-04-16 00:18

我有一个 <img src=__string__>,但是字符串里面可能会包含双引号("),我该怎么处理才能让它正常工作呢?

举个例子:

__string__ = test".jpg
<img src="test".jpg">

这样是不行的。

5 个回答

4
import cgi
s = cgi.escape('test".jpg', True)

请注意,True这个标志会让它转义双引号。如果你还需要转义单引号(如果你是那种少见的人,喜欢用单引号来包裹HTML属性),可以查看那个文档链接中关于xml.sax.saxutils.quoteattr()的说明。后者可以处理两种引号,不过速度大约慢三倍:

>>> timeit.Timer( "escape('asdf\"asef', True)", "from cgi import escape").timeit()
1.2772219181060791
>>> timeit.Timer( "quoteattr('asdf\"asef')", "from xml.sax.saxutils import quoteattr").timeit()
3.9785079956054688
15

在Python 3.2版本中,新增了一个叫做html的模块,这个模块主要用来处理HTML标记中的一些特殊字符,让它们变得安全。

这个模块里有一个函数叫做html.escape(s, quote=True)。如果你把可选的参数quote设置为真(True),那么字符(")(')也会被转换成安全的形式。

用法示例:

>>> import html
>>> html.escape('x > 2 && x < 7')
'x &gt; 2 &amp;&amp; x &lt; 7'
13

如果你要处理的值可能包含引号,最好的办法是使用 quoteattr 方法:http://docs.python.org/library/xml.sax.utils.html#module-xml.sax.saxutils

这个方法在关于 cgi.escape() 方法的文档下面有提到。

撰写回答