使用python编码URL的百分比

时间:2012-08-24 18:32:27

标签: python url encoding

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

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

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

我试过了:

该过程称为URL encoding

>>> 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

如何正确编码此网址?

这里的文档:

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 +和+ the Mysterians。

1 个答案:

答案 0 :(得分: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不会默认为'/')。