2011-11-15 21 views
44

Ho una lista contenente URL con caratteri di escape in essi. Quei personaggi sono stati fissati dal urllib2.urlopen quando recupererà la pagina html:Decodifica caratteri di escape nell'URL

http://www.sample1webpage.com/index.php?title=%E9%A6%96%E9%A1%B5&action=edit 
http://www.sample1webpage.com/index.php?title=%E9%A6%96%E9%A1%B5&action=history 
http://www.sample1webpage.com/index.php?title=%E9%A6%96%E9%A1%B5&variant=zh 

C'è un modo per trasformare di nuovo alla loro forma di escape in Python?

P.S .: Gli URL sono codificati in utf-8

risposta

82

Official docs.

urllib.unquote(stringa)

Sostituire %xx fughe da loro equivalenti in singolo carattere.

Esempio: unquote('/%7Econnolly/') rese '/~connolly/'.

E quindi basta decodificare.


Aggiornamento: Per Python 3, scrivere quanto segue:

urllib.parse.unquote(url) 

Python 3 docs.

+0

gli spettacoli unquote come ho detto sopra sample.com/index.php?title=\xe9\xa6\x96\xe9\xa1 \ xb5 & action = edi ... forse non mi sono spiegato molto bene in questo caso ... ma l'url è cinese e voglio decodificare il suo char originale, non quello univoco – dyoser

+3

@dyoser Devi mettere questo nella tua domanda –

+0

@ root45 questo è un commento ad una risposta ... quindi va bene qui. Grazie per il tuo apprezzamento. – dyoser

6

È possibile utilizzare urllib.unquote

+0

quando uso l'unquote (grazie tra l'altro ...) mostra questa stringa http: //sample.com/index.php? Title = \ xe9 \ xa6 \ x96 \ xe9 \ xa1 \ xb5 & action = edi e so che sono caratteri cinesi ... come posso vederli? Immagino che questo sia unicode, giusto? – dyoser

+0

Questo è già nella tua domanda. Quelli sono i byte UTF-8; puoi convertirli in una stringa Unicode con 'b" \ xe9 \ xa6 \ x96 \ xe9 \ xa1 \ xb5 ".decode (" utf-8 ")' (usando una sintassi Python un po 'più moderna ora). – tripleee

3
import re 

def unquote(url): 
    return re.compile('%([0-9a-fA-F]{2})',re.M).sub(lambda m: chr(int(m.group(1),16)), url) 
+7

Perché dovresti usare manualmente espressioni regolari e lambda quando c'è una libreria incorporata che fa ciò di cui hai bisogno, probabilmente anche più pensieroso? –

+4

Soluzione cool! 'urllib2' non fa parte della distribuzione standard di python. 're' è. – cxxl

9

o urllib.unquote_plus

>>> import urllib 
>>> urllib.unquote('erythrocyte+membrane+protein+1%2C+PfEMP1+%28VAR%29') 
'erythrocyte+membrane+protein+1,+PfEMP1+(VAR)' 
>>> urllib.unquote_plus('erythrocyte+membrane+protein+1%2C+PfEMP1+%28VAR%29') 
'erythrocyte membrane protein 1, PfEMP1 (VAR)' 
18

E se si utilizza Python3 si potrebbe usare:

urllib.parse.unquote(url) 
+0

Anche in 'urllib.request.unquote' – Ben

Problemi correlati