在Python中,如何将*all*字符转义为对应的html实体名称和数字?

在Python中,如何将*all*字符转义为对应的html实体名称和数字?,python,python-3.x,html-entities,Python,Python 3.x,Html Entities,我想把一个字符串编码成它对应的html实体,但不幸的是我不能。正如我在问题标题中所说,我希望字符串中的所有字符都转换为它们相应的html实体(数字和名称)。因此,根据报告。我试过: 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

我想把一个字符串编码成它对应的html实体,但不幸的是我不能。正如我在问题标题中所说,我希望字符串中的所有字符都转换为它们相应的html实体(数字和名称)。因此,根据报告。我试过:

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实体的资源都没有编码所有字符,而且php
htmlspecialchars()
函数也没有这样做。我不想一个字符一个字符地写所有的html实体号。

你不需要一个特殊的函数来完成你的工作,因为你想要的数字只是这些字符的Unicode代码点

做你想做的事:

 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解析器专用字符的字符串,因此
escape
只替换少数字符。除此之外,您所做的操作确保字符串中的所有字符都是ASCII

如果要尽可能强制使用命名实体,可以在对字符应用
ord
后检查映射:

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

您在转义字符串中忘记了一些分号吗?@madpysicator在
a
变量中?我不这么认为。我非常确定html实体应该以semicolon@MadPhysicist当然可以,但它们是故意省略的。看,这很整洁。我想知道你在干什么;)有一点需要澄清:正如您所说,字符串中的字符应该是ASCII,但是
ord
文档中说,它们可以是任何unicode字符,而且我链接的页面也有非ASCII字符。对吗?
ord
的输出都是ascii,而不是输入。
ord
的输出是一个整数,然后表示为一个只包含ascii的字符串。
def encode(s):
    return ''.join('&{};'.format(codepoint2name.get(i, '#{}'.format(i))) for i in map(ord, s))