2009-08-19 19 views
9

Tengo problemas para convertir una URL en una tupla anidada.¿Cómo puedo convertir una cadena de consulta de URL en una lista de tuplas 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')] 

Asumo que necesito estar haciendo algo como:

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

¿Qué estoy haciendo mal? ¡Gracias!

Respuesta

28

Creo que está buscando el módulo urlparse.

Este módulo define una interfaz estándar para romper Uniform Resource Locator (URL) cuerdas en componentes (esquema de direccionamiento, ubicación de red, ruta etc.), para combinar los componentes vuelta a una cadena URL , y para convertir un “URL relativa” a una URL absoluta dado un

Aquí es un ejemplo “URL base.”:

from urlparse import urlparse, parse_qsl 

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

de salida:

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

En este ejemplo primero utilizar la función urlparse para analizar toda la URL a continuación, utilizo la función parse_qsl para romper la cadena de consulta (el quinto elemento volvió de urlparse) en una lista de tuplas

+0

Guau, perfecto. ¡Gracias! – orwellian

0

La respuesta de Andrew fue realmente informativa y útil. Una manera menos hábil para agarrar esos parametros estaría con una expresión regular - algo como esto:

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) 

Asimismo, en su código que parece que está tratando de concatenar una lista y tuple--

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

Has creado obtener como una tupla, pero str.split devuelve una lista. Tal vez esto podría corregir su código:

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

He publicado esto hace mucho tiempo ... merecía el voto en negativo. – twneale

Cuestiones relacionadas