gpt4 book ai didi

python - 如何在 Python 中将 *所有* 字符转义为相应的 html 实体名称和数字?

转载 作者:太空宇宙 更新时间:2023-11-04 02:02:08 24 4
gpt4 key购买 nike

我想将字符串编码为相应的 html 实体,但不幸的是我做不到。正如我在问题标题中所说,我希望将字符串中的 所有 字符转换为它们相应的 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 实体编号逐个字符。

最佳答案

对于您正在做的事情,您真的不需要特殊的功能,因为您想要的数字只是相关字符的 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.escape有什么特别之处?和 html.unescape除了数字实体之外,它们还支持命名实体。转义的目的通常是将您的字符串转换为不包含 HTML 解析器特殊字符的内容,因此 escape 仅替换少量字符。您正在做的事情确保字符串中的所有字符除此之外都是 ASCII。

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

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

关于python - 如何在 Python 中将 *所有* 字符转义为相应的 html 实体名称和数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55494644/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com