python - 如何在 Python 中将 *all* 字符转义为相应的 html 实体名称和数字?
问题描述
我想将一个字符串编码为其相应的 html 实体,但不幸的是我做不到。正如我在问题标题中所说,我希望将字符串中的所有字符转换为相应的 html 实体(数字和名称)。所以根据文档。我试过了:
In [31]: import html
In [32]: s = '<img src=x onerror="javascript:alert("XSS")">'
In [33]: html.escape(s)
Out[33]: '<img src=x onerror="javascript:alert("XSS")">'
但我希望所有字符都被转换,而不仅仅是 '<' 、 '>' 、 '&' 等。并且html.escape
只给出 html 实体名称而不是数字,但我想要两者。
但令人惊讶的是html.unescape
,将所有实体转义为相应的字符。
In [34]: a = '<img src=x onerror="javascript
...: 8alert('XSS')">'
In [35]: html.unescape(a)
Out[35]: '<img src=x onerror="javascript:alert(\'XSS\')">'
那么我可以做同样的事情html.escape
吗?
我真的很惊讶为什么互联网上用于编码和解码 html 实体的所有htmlspecialchars()
资源都没有对所有字符进行编码,而且 php函数也不这样做。而且我不想从这里一个字符一个字符地写出所有的 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.codepoint2name
后检查映射:ord
def encode(s):
return ''.join('&{};'.format(codepoint2name.get(i, '#{}'.format(i))) for i in map(ord, s))
推荐阅读
- ethereum - How can i store a contract address
- python - Efficient computation of betweenness centralities on a weighted Moore neighborhood graph
- python - Making a mean-SD distribution graph of a pandas DataFrame
- mongoose - Mongoose 查询运算符 $in 以查看对象数组
- javascript - How to output host and port of webpack-dev-server (with vue-cli)
- signalr - 我可以相信 Microsoft BackgroundService 始终存在吗?
- flutter - Flutter:为动态加载的标签重建脚手架?
- android - 设置 Uri (Android Studio) 后 ImageView 为空白
- java - 无法解析方法'with(匿名 com.android.volley.Response.Listener
)' - c++ - 从以下 func(int *argc, char ***argv) 打印参数