7

当我在 maps.google.com 中输入 URL 时,例如https://dl.dropbox.com/u/94943007/file.kml,它会将此 URL 编码为:

https:%2F%2Fdl.dropbox.com%2Fu%2F94943007%2Ffile.kml

我想知道这种编码叫什么,有没有办法使用 python 对这样的 URL 进行编码?

我试过这个:

该过程称为URL 编码

>>> urllib.quote('https://dl.dropbox.com/u/94943007/file.kml', '')
'https%3A%2F%2Fdl.dropbox.com%2Fu%2F94943007%2Ffile.kml'

但没有得到预期的结果:

'https%3A//dl.dropbox.com/u/94943007/file.kml'

我需要的是这个:

https:%2F%2Fdl.dropbox.com%2Fu%2F94943007%2Ffile.kml

如何正确编码此 URL?

这里的文档:

https://developers.google.com/maps/documentation/webservices/

状态:

所有要进行 URL 编码的字符都使用 '%' 字符和与其 UTF-8 字符对应的两个字符的十六进制值进行编码。例如,UTF-8 中的上海+中国将被 URL 编码为 %E4%B8%8A%E6%B5%B7%2B%E4%B8%AD%E5%9C%8B。字符串?Mysterians 将被 URL 编码为 %3F+and+the+Mysterians。

4

1 回答 1

7

采用

urllib.quote_plus(url, safe=':')

由于您不希望对冒号进行编码,因此您需要在调用时指定urllib.quote()

>>> expected = 'https:%2F%2Fdl.dropbox.com%2Fu%2F94943007%2Ffile.kml'
>>> url = 'https://dl.dropbox.com/u/94943007/file.kml'
>>> urllib.quote(url, safe=':') == expected
True

urllib.quote()safe采用默认的关键字参数/并指示哪些字符被认为是安全的,因此不需要编码。在您使用的第一个示例''中,导致斜杠被编码。您在斜线未编码的下方粘贴的意外输出可能来自您之前根本没有设置关键字参数的尝试safe

覆盖默认值'/'并排除冒号':'是最终产生所需结果的原因。

编辑:此外,API 要求将空格编码为加号。因此urllib.quote_plus()应该使用(其关键字参数safe不默认为'/')。

于 2012-08-24T18:41:21.490 回答