2012-01-18 44 views
20

urllib或其他庫中是否存在一個簡單的方法來執行此任務? URL編碼將用不安全的ASCII字符替換爲後跟兩個十六進制數字的「%」。python中的URL編碼

下面是一個輸入的一個例子,我的預期輸出:

Mozilla/5.0 (Linux; U; Android 4.0; xx-xx; Galaxy Nexus Build/IFL10C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 

Mozilla%2F5.0+%28Linux%3B+U%3B+Android+4.0%3B+xx-xx%3B+Galaxy+Nexus+Build%2FIFL10C%29+AppleWebKit%2F534.30+%28KHTML%2C+like+Gecko%29+Version%2F4.0+Mobile+Safari%2F534.30 

回答

41

對於Python 2.x中,使用urllib.quote

更換使用%XX轉義字符串中的特殊字符。字母,數字和字符'_.-'從不引用。默認情況下,此功能用於引用URL的路徑部分。可選的安全參數指定不應引用的附加字符 - 其默認值爲「/」。

例如:

In [1]: import urllib 

In [2]: urllib.quote('%') 
Out[2]: '%25' 

編輯

在你的情況下,爲了通過加號來代替空間,你可以使用urllib.quote_plus

例如:

In [4]: urllib.quote_plus('a b') 
Out[4]: 'a+b' 

對於Python 3.x中,使用quote

>>> import urllib 
>>> a = "asdas#@das" 
>>> urllib.parse.quote(a) 
'asdas%23%40das' 

和串空間使用「quote_plus」

>>> import urllib 
>>> a = "as da& s#@das" 
>>> urllib.parse.quote_plus(a) 
'as+da%26+s%23%40das' 
+0

或[urllib.quote_plus](http://docs.python.org/library/urllib.html#urllib.quote_plus),因爲OP需要'+'而不是'%20'。 – Avaris 2012-01-18 06:09:55

+2

但爲了得到OP要求的內容,使用'urllib.quote_plus'。 – 2012-01-18 06:10:02

1

另外,如果你有多個值的字典,最好的辦法做到這一點將是urllib.urlencode

2

請記住,無論urllib.quoteurllib.quote_plus拋出一個錯誤,如果輸入是一個unicode字符串:

s = u'\u2013' 
urllib.quote(s) 

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Python27\lib\urllib.py", line 1303, in quote 
    return ''.join(map(quoter, s)) 
KeyError: u'\u2013' 

作爲回答here on SO,人們必須使用 'UTF-8' 明​​確:

urllib.quote(s.encode('utf-8'))