如何在Python中对URL参数进行百分比编码?

如果我做

url = "http://example.com?p=" + urllib.quote(query) 
  1. 它不编码/%2F (打破OAuth标准化)
  2. 它不处理Unicode(它抛出一个exception)

有更好的图书馆吗?

从文档 :

 urllib.quote(string[, safe]) 

使用%xx转义replacestring中的特殊字符。 字母,数字和字符'_.-'从不引用。 默认情况下,此函数用于引用URL的path部分。可选的safe参数指定不应引用的附加字符 – 其默认值为“/”

这意味着通过“安全”将解决你的第一个问题:

 >>> urllib.quote('/test') '/test' >>> urllib.quote('/test', safe='') '%2Ftest' 

关于第二个问题,这里有一个关于它的错误报告。 显然它是固定在Python 3.你可以通过编码utf8这样的解决方法:

 >>> query = urllib.quote(u"Müller".encode('utf8')) >>> print urllib.unquote(query).decode('utf8') Müller 

顺便看看urlencode

请注意, urllib.quote移至urllib.parse.quote中的urllib.parse.quote

在Python 3中, urllib.quote已经被移到了urllib.parse.quote并且默认处理unicode。

 >>> from urllib.parse import quote >>> quote('/test') '/test' >>> quote('/test', safe='') '%2Ftest' >>> quote('/El Niño/') '/El%20Ni%C3%B1o/' 

我的答案与保罗的答案相似。

我认为模块requests好得多。 它基于urllib3 。 你可以试试这个:

 >>> from requests.utils import quote >>> quote('/test') '/test' >>> quote('/test', safe='') '%2Ftest' 

如果你使用的是django,你可以使用urlquote:

 >>> from django.utils.http import urlquote >>> urlquote(u"Müller") u'M%C3%BCller'