Python中是否有与PHP函数htmlspecialchars()等效的功能?

20

在Python中是否有与PHP函数htmlspecialchars()类似或等效的功能?到目前为止,我找到的最接近的是htmlentitydefs.entitydefs()。


1
似乎有不止一种显而易见的方法来做这件事!哦,不好! - Grant Paul
8个回答

12

它自3.3版本以来已被弃用。 - ncopiy

7
from django.utils.html import escape
print escape('<div class="q">Q & A</div>')

1
我选择这个选项,因为我不想像其他答案一样解析任何东西,甚至进行搜索和替换,我希望有一个单一的函数可以为我完成所有操作。 - paulmorriss

5

在 @garlon4 的回答基础上,你可以定义自己的 htmlspecialchars(s)

def htmlspecialchars(text):
    return (
        text.replace("&", "&amp;").
        replace('"', "&quot;").
        replace("<", "&lt;").
        replace(">", "&gt;")
    )

我认为Python有一个名为“translate”的高级函数,你可以用它来使代码更短。 - Brian Peterson
现在有点懒,但是:https://www.programiz.com/python-programming/methods/string/translate - Brian Peterson
非常有帮助的回答,不过您把参数传递给 replace() 函数的顺序搞反了。正确的方式是:replace("要查找的字符串", "替换为的字符串")。 - Ben
@Ben 不,这个函数的工作是符合预期的(它转义了“HTML特殊字符”)。它寻找需要转义的字符,并将其替换为该字符的HTML转义序列。也许你想要反转义? - AlejandroVD
我的错误!@AlejandroVD,你是完全正确的。 - Ben

3

我认为最简单的方法就是使用replace:

text.replace("&", "&amp;").replace('"', "&quot;").replace("<", "&lt;").replace(">", "&gt;")

PHP只用htmlspecialchars来转义这四个实体。请注意,如果您在PHP中设置了ENT_QUOTES,则需要使用&#039;而不是&quot;来替换引号。


3
您可能需要使用xml.sax.saxutils.escape来进行转义:
from xml.sax.saxutils import escape
escape(unsafe, {'"':'&quot;'}) # ENT_COMPAT
escape(unsafe, {'"':'&quot;', '\'':'&#039;'}) # ENT_QUOTES
escape(unsafe) # ENT_NOQUOTES

请看xml.sax.saxutils.quoteattr,它可能更适合您的需求。


1

只需要转义五个字符,因此您可以使用一个简单的一行函数:

def htmlspecialchars(content):
    return content.replace("&", "&amp;").replace('"', "&quot;").replace("'", "&#039;").replace("<", "&lt;").replace(">", "&gt;")

1

html.entities 模块(对于 Python 2.x 是 htmlentitydefs)包含一个名为 codepoint2name 的字典,它应该能满足您的需求。

>>> import html.entities
>>> html.entities.codepoint2name[ord("&")]
'amp'
>>> html.entities.codepoint2name[ord('"')]
'quot'

-1
如果您正在使用django 1.0,则模板变量已经被编码并准备好显示。如果您不想全局启用它,还可以使用safe运算符{{ var|safe }}

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