2012-01-18 22 views
20

C'è un metodo semplice che mi manca in urllib o altra libreria per questa attività? La codifica dell'URL sostituisce caratteri ASCII non sicuri con un "%" seguito da due cifre esadecimali.Codifica URL in python

Ecco un esempio di un ingresso e la mia uscita prevista:

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 

risposta

41

Per Python 2.x, utilizzare urllib.quote

Sostituire i caratteri speciali nella stringa utilizzando la fuga% xx. Lettere, cifre e caratteri '_.-' non vengono mai citati. Per impostazione predefinita, questa funzione è intesa per la citazione della sezione percorso dell'URL. Il parametro safe facoltativo specifica caratteri aggiuntivi che non dovrebbero essere citati: il suo valore predefinito è '/'.

esempio:

In [1]: import urllib 

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

EDIT:

Nel tuo caso, al fine di sostituire lo spazio con segno più, è possibile utilizzare urllib.quote_plus

esempio:

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

Per Python 3.x, utilizzare quote

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

e per la stringa con l'utilizzo dello spazio 'quote_plus'

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

o [urllib.quote_plus] (http://docs.python.org/library/urllib.html#urllib.quote_plus), poiché OP vuole '+' invece di '% 20'. – Avaris

+2

ma per ottenere ciò che l'OP chiede, usa 'urllib.quote_plus'. –

1

Inoltre, se si dispone di un dict di diversi valori, il modo migliore per farlo sarà urllib.urlencode.

2

Tenete a mente che sia urllib.quote e urllib.quote_plus genera un errore se un input è una stringa 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' 

come risposta here on SO, si deve usare 'UTF-8' esplicitamente:

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