Urlize 在文本 href 中转义 %23

Urlize escaping %23 in href of text

我正在尝试呈现来自用户的带有 url 的文本,如下所示:https://example.com/%20%23654

我将 url 传递给 urlize,我得到了这个:

In[1]: outp = urlize('https://example.com/%20%23654'); print outp
Out[1]: u'<a href="https://example.com/%20#654">https://example.com/%20%23654</a>'

我知道 %20 转义为 space 和 %23 为散列,但为什么它只转义 href 中的散列?这是一个错误吗?如果是有意的,为什么不将 %20 转义为空白 space?

我不认为这是一个错误。

我看到了这个问题的两个部分:

为什么它只转义散列而不转义 space? 为什么它只在 href 而不是在可见的 linked 文本中进行转义?

这是我对第一个的看法:

散列是完全合法的 URL 路径字符。它最常用于 HTML 中的锚点(示例和 link 文档合二为一!):

http://www.w3.org/TR/html4/struct/links.html#h-12.2

urlize 意识到这一点。它取消了 href 中的哈希。它适用于任何合法的 URL 字符。这是字母 f:

的示例
>>> urlize('https://example.com/%66')
u'<a href="https://example.com/f">https://example.com/%66</a>'

另一方面,space 不是合法的 URL 字符(尽管通常可以容忍)。因此,它在 link 和可见的 link 描述中都保持编码为 %20

问题的第二部分是为什么它只在 link 而不是在可见描述中转义。这也是有道理的。在href中,传入https://example.com/%66https://example.com/f都没有关系。效果是一样的,描述是"under the hood."所以urlize用了最简单的形式,去掉了不必要的编码。另一方面,将可见部分呈现给用户。因此,urlize 试图保留最初传入的准确描述,因为这是最不令人惊讶的事情。