【问题标题】:How can I escape *all* characters into their corresponding html entity names and numbers in Python?如何在 Python 中将 *all* 字符转义为相应的 html 实体名称和数字?
【发布时间】:2019-04-03 12:00:07
【问题描述】:

我想将一个字符串编码为其对应的 html 实体,但不幸的是我做不到。正如我在问题标题中所说,我希望将字符串中的 all 字符转换为相应的 html 实体(数字和名称)。所以根据documentation。我试过了:

In [31]: import html

In [32]: s = '<img src=x onerror="javascript:alert("XSS")">'

In [33]: html.escape(s)
Out[33]: '&lt;img src=x onerror=&quot;javascript:alert(&quot;XSS&quot;)&quot;&gt;'

但我希望转换所有字符,而不仅仅是 '' 、 '&' 等。 而且html.escape 只提供 html 实体 names 而不是数字,但我两者都想要。

但令人惊讶的是,html.unescape 将所有实体转义为对应的字符。

In [34]: a = '<img src=x onerror="&#0000106&#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#0000112&#0000116&#000005
    ...: 8&#0000097&#0000108&#0000101&#0000114&#0000116&#0000040&#0000039&#0000088&#0000083&#0000083&#0000039&#0000041">'

In [35]: html.unescape(a)
Out[35]: '<img src=x onerror="javascript:alert(\'XSS\')">' 

那么我可以对html.escape 做同样的事情吗?

我真的很惊讶为什么互联网上用于编码和解码 html 实体的 所有 资源没有对所有字符进行编码,而且 php htmlspecialchars() 函数也不这样做。而且我不想从here一个字符一个字符地写出所有的html实体编号。

【问题讨论】:

  • 您是否忘记了转义字符串中的一些分号?
  • @MadPhysicist 在a 变量中?我不这么认为。
  • 我很确定 html 实体应该以分号结尾
  • @MadPhysicist 当然可以,但它们有意被省略,请参阅this
  • 这很好。我想知道你在做什么;)

标签: python python-3.x html-entities


【解决方案1】:

您实际上并不需要一个特殊的函数来处理您正在做的事情,因为您想要的数字只是相关字符的 Unicode 代码点。

ord 几乎可以满足您的需求:

 def encode(s):
     return ''.join('&#{:07d};'.format(ord(c)) for c in s)

从美学上讲,我更喜欢十六进制编码:

 def encode(s):
     return ''.join('&#x{:06x};'.format(ord(c)) for c in s)

html.escapehtml.unescape 的特别之处在于它们除了支持数字实体外,还支持命名实体。转义的目标通常是将您的字符串转换为没有 HTML 解析器特殊字符的字符串,因此 escape 仅替换少数字符。您正在做的事情确保字符串中的所有字符除此之外都是 ASCII。

如果您想尽可能强制使用命名实体,可以在将ord 应用于字符后检查html.entities.codepoint2name 映射:

def encode(s):
    return ''.join('&{};'.format(codepoint2name.get(i, '#{}'.format(i))) for i in map(ord, s))

【讨论】:

  • 一个澄清:正如你所说,字符串中的那些字符应该是 ASCII 但ord 文档说它们可以是任何 unicode 字符,而且我链接的页面 do 有字符不是ASCII。对吗?
  • ord输出 将全部是 ascii,而不是输入。
  • ord 的输出是一个整数,然后表示为一个只包含 ASCII 的字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-19
相关资源
最近更新 更多