2009-08-19 22 views
9

Non riesco a convertire un URL in una tupla annidata.Come posso convertire una stringa di query URL in una lista di tuple usando Python?

# Convert this string 
str = 'http://somesite.com/?foo=bar&key=val' 

# to a tuple like this: 
[(u'foo', u'bar'), (u'key', u'val')] 

presumo che ho bisogno di fare qualcosa di simile:

url = 'http://somesite.com/?foo=bar&key=val' 
url = url.split('?') 
get =() 
for param in url[1].split('&'): 
    get = get + param.split('=') 

Che cosa sto facendo di sbagliato? Grazie!

risposta

28

Credo che stiate cercando il modulo urlparse.

Questo modulo definisce un'interfaccia standard di rompere Uniform Resource Locator (URL) Corde in componenti (schema di indirizzamento, percorso di rete, percorso, ecc), per combinare i componenti in una stringa URL , e per convertire URL di tipo “relativo” ad un URL assoluto dato un

Ecco un esempio “URL di base.”:

from urlparse import urlparse, parse_qsl 

url = 'http://somesite.com/?foo=bar&key=val' 
print parse_qsl(urlparse(url)[4]) 

uscita:

[('foo', 'bar'), ('key', 'val')] 

In questo esempio ho utilizzare la funzione urlparse per analizzare l'intero URL allora io uso la funzione parse_qsl per rompere la querystring (il quinto elemento tornato da urlparse) in una lista di tuple.

+0

Wow, perfetto. Grazie! – orwellian

0

La risposta di Andrew è stata molto istruttiva e utile. Un modo meno abili ad afferrare quei params sarebbe con un'espressione regolare - qualcosa di simile:

import re

re_param = re.compile(r'(?P<key>w\+)=(?P<value>w\+)') 

url = 'http://somesite.com/?foo=bar&key=val'' 
params_list = re_param.findall(url) 

Inoltre, nel codice sembra che si sta cercando di concatenare una lista e tuple--

Hai creato come una tupla, ma str.split restituisce una lista. Forse questo potrebbe risolvere il tuo codice:

for param in url[1].split('&'): 
    get = get + tuple(param.split('=')) 
+2

L'ho postato molto tempo fa ... mi sono meritato il downvote. – twneale

Problemi correlati