在Python中逃避HTML的最简单方法是什么?

Jos*_*son 131 html python

cgi.escape似乎是一种可能的选择.它运作良好吗?有什么东西被认为更好吗?

nos*_*klo 175

cgi.escape很好.它逃脱了:

  • <&lt;
  • >&gt;
  • &&amp;

这对所有HTML都足够了.

编辑:如果您有非ascii字符,您也想要转义,包含在另一个使用不同编码的编码文档中,如Craig说,只需使用:

data.encode('ascii', 'xmlcharrefreplace')
Run Code Online (Sandbox Code Playgroud)

不要忘了解码dataunicode第一,使用任何编码它编码的.

但是根据我的经验,如果你unicode从一开始就一直工作,那种编码就没用了.只需在文档头中指定的编码结束时进行编码(utf-8以获得最大的兼容性).

例:

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

另外值得注意的是(感谢Greg)是额外的quote参数cgi.escape需要.设置为True,cgi.escape也会转义双引号字符("),以便您可以在XML/HTML属性中使用结果值.

编辑:请注意,cgi.escape在Python 3.2中已被弃用,html.escape除了quote默认为True 之外,它的作用相同.

  • 当在HTML属性值中使用文本时,还应考虑使用cgi.escape的附加布尔参数来转义引号. (7认同)

Mac*_*rko 95

在Python 3.2 html中引入了一个新模块,用于从HTML标记中转义保留字符.

它有一个功能escape():

>>> import html
>>> html.escape('x > 2 && x < 7')
'x &gt; 2 &amp;&amp; x &lt; 7'
Run Code Online (Sandbox Code Playgroud)

  • @SalmanAbbas 你担心引号没有被转义吗?请注意,默认情况下,`html.escape()` 会转义引号(相反,`cgi.quote()` 不会转义 - 并且仅转义双引号(如果告知的话)。因此,我必须显式设置一个可选参数,以使用 `html.escape()` 将某些内容注入到属性中,即使其对属性不安全:`t = '" onclick="alert()'; t = html.escape(t, quote=False); s = f'&lt;a href="about.html" class="{t}"&gt;foo&lt;/a&gt;'` (3认同)

Sup*_*Guy 10

如果您希望在URL中转义HTML:

这可能不是OP想要的(问题没有清楚地表明在哪个上下文中意图使用转义),但Python的本机库urllib有一个方法来转义需要安全地包含在URL中的HTML实体.

以下是一个例子:

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

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

在这里查找文档

  • 这是一种错误的逃避; 我们正在寻找[HTML转义](http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references),而不是[URL编码](http://en.wikipedia.org/wiki/URL_Encoding). (9认同)
  • 尽管如此 - 这是我真正想要的;-) (5认同)

Cra*_*een 8

cgi.escape 在转义HTML标记和字符实体的有限意义上,应该很好地逃避HTML.

但是您可能还必须考虑编码问题:如果您要引用的HTML在特定编码中具有非ASCII字符,那么您还必须注意在引用时明智地表示这些字符.也许您可以将它们转换为实体.否则,您应确保在"源"HTML与其嵌入的页面之间进行正确的编码转换,以避免破坏非ASCII字符.


Bri*_*unt 8

还有优秀的markupsafe包.

>>> from markupsafe import Markup, escape
>>> escape("<script>alert(document.cookie);</script>")
Markup(u'&lt;script&gt;alert(document.cookie);&lt;/script&gt;')
Run Code Online (Sandbox Code Playgroud)

markupsafe软件包设计精良,可能是最通用和Pythonic的方式逃避,恕我直言,因为:

  1. return(Markup)是一个派生自unicode的类(即isinstance(escape('str'), unicode) == True
  2. 它正确处理unicode输入
  3. 它适用于Python(2.6,2.7,3.3和pypy)
  4. 它尊重对象的自定义方法(即具有__html__属性的对象)和模板重载(__html_format__).


spe*_*ane 5

没有库,纯 python,可以安全地将文本转义为 html 文本:

text.replace('&', '&amp;').replace('>', '&gt;').replace('<', '&lt;'
        ).replace('\'','&#39;').replace('"','&#34;').encode('ascii', 'xmlcharrefreplace')
Run Code Online (Sandbox Code Playgroud)

  • 您的顺序错误,“&lt;”将转义为“&lt;” (2认同)