Python输入清理

13

我需要快速进行一些简单的输入过滤,并希望基本上将所有 <, > 转换为 &lt;, &gt;

我想实现与 '<script></script>'.replace('<', '&lt;').replace('>', '&gt;') 相同的结果,而无需多次迭代字符串。 我知道 maketrans 结合 str.translate 可以实现转换(例如:http://www.tutorialspoint.com/python/string_translate.htm),但这只能将一个字符转换为另一个字符。 换句话说,不能执行以下操作:

inList = '<>'
outList = ['&lt;', '&gt;']
transform = maketrans(inList, outList)

有没有一个 builtin 函数可以在单次迭代中完成此转换?

我想使用内置功能而不是外部模块。我已经知道了关于Bleach的信息。


为什么不手动迭代呢? - Kevin
在这种情况下,似乎您实际上想要特别编码HTML中的字符,请查看https://dev59.com/cnRB5IYBdhLWcg3wJklC。 - Nicolas78
请参考 https://dev59.com/tW025IYBdhLWcg3wRDm8 了解如何进行多个字符串的替换。 - augurar
3个回答

14

请使用html.escape()函数——在Python 3中,cgi.escape()已经不建议使用了。

import html
input = '<>&'
output = html.escape(input)
print(output)

&lt;&gt;&amp;

12
你可以使用 cgi.escape()
import cgi
inlist = '<>'
transform = cgi.escape(inlist)
print transform

输出:

&lt;&gt;

https://docs.python.org/2/library/cgi.html#cgi.escape

cgi.escape(s[, quote]) 函数可以将字符串s中的字符 '&', '<' 和 '>' 转换为HTML安全序列。如果您需要在HTML中显示可能包含这些字符的文本,请使用此函数。如果可选标志quote为真,则引号字符 (") 也会被转换;这有助于包含在由双引号 delimiter 的HTML属性值中,例如。请注意,单引号永远不会被转换。


2
如其他评论所述,自Python 3.2起,此方法已被弃用(https://docs.python.org/3.7/library/cgi.html#cgi.escape)。建议使用html.escape。 - Cheche

3
你可以定义自己的函数,循环遍历字符串并替换你定义的任何字符。
def sanitize(input_string):
    output_string = ''
    for i in input_string:
        if i == '>':
            outchar = '&gt;'
        elif i == '<':
            outchar = '&lt;'
        else:
            outchar = i
        output_string += outchar
    return output_string

然后调用
sanitize('<3 because I am > all of you')

产量
'&lt;3 because I am &gt; all of you'

3
请看一下 string.join 和列表推导式! - Nicolas78
1
使用字符串连接符“+”是二次的,因为它每次都会构造一个新的字符串。我认为CPython可以将其优化为线性操作,但其他实现如PyPy可能无法做到。 - Kevin
3
重要提示:当自己编写过滤器时,请务必使用明确的字符列表。如果有任何不在允许字符集中的字符,应该a)抛出错误,b)删除它,或者c)用某个中性字符替换它...例如:else if i in set(string.ascii_letters + string.ascii_digits): ... - Erik Aronesty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接