Parámetro de URI de análisis y pares de valores de palabras clave

Me gustaría analizar los valores de parámetros y palabras clave de URI / L en un archivo de texto. También deben incluirse parámetros sin valores. Python está bien, pero estoy abierto a sugerencias utilizando otras herramientas como Perl o una sola línea que también puede hacer el truco.

Fuente de ejemplo:

www.domain.com/folder/page.php?date=2012-11-20 www2.domain.edu/folder/folder/page.php?l=user&x=0&id=1&page=http%3A//domain.com/page.html&unique=123456&refer=http%3A//domain2.net/results.aspx%3Fq%3Dbob+test+1.21+some%26file%3Dname&text= www.domain.edu/some/folder/image.php?l=adm&y=5&id=2&page=http%3A//support.domain.com/downloads/index.asp&unique=12345 blog.news.org/news/calendar.php?view=month&date=2011-12-10 

Ejemplo de salida:

 date=2012-11-20 l=user x=0 page=http%3A//domain.com/page.html&unique=123456 refer=http%3A//domain2.net/results.aspx%3Fq%3Dbob+test+1.21+some%26file%3Dname test= l=adm y=5 id=2 page=http%3A//support.domain.com/downloads/index.asp unique=12345 view=month date=2011-12-10 

No necesitas sumergirte en el frágil mundo de expresiones regulares.

urlparse.parse_qsl() es la herramienta para el trabajo ( urllib.quote() ayuda a escapar caracteres especiales):

 from urllib import quote from urlparse import parse_qsl, urlparse with open('links.txt') as f: for url in f: params = parse_qsl(urlparse(url.strip()).query, keep_blank_values=True) for key, value in params: print "%s=%s" % (key, quote(value)) 

Huellas dactilares:

 date=2012-11-20 l=user x=0 id=1 page=http%3A//domain.com/page.html unique=123456 refer=http%3A//domain2.net/results.aspx%3Fq%3Dbob%20test%201.21%20some%26file%3Dname text= l=adm y=5 id=2 page=http%3A//support.domain.com/downloads/index.asp unique=12345 view=month date=2011-12-10 

Espero que ayude.

Yo usaría una expresión regular como esta (primer código luego explicación):

 pairs = re.findall(r'(\w+)=(.*?)(?:\n|&)', s, re.S) for k, v in pairs: print('{0} = {1}'.format(k, v)) 

La primera línea es donde ocurre la acción. La expresión regular encuentra todas las apariciones de una palabra seguida de un signo igual y luego una cadena que termina con un & o con una nueva línea char. Los pairs retorno son una lista de tuplas, donde cada tupla contiene la palabra (la palabra clave) y el valor. No capturé el signo = , sino que lo imprimí en el bucle.

Explicando la expresión regular:

\w+ significa uno o más caracteres de palabras. El paréntesis a su alrededor significa capturarlo y devolver ese valor como resultado.

= – el signo igual que debe seguir la palabra

.*? – cero o más caracteres de manera no codiciosa, es decir, hasta que aparezca una nueva línea o el signo & , designado por \n|& . El patrón (?:.. significa que el \n o & no debe ser capturado.

Ya que capturamos 2 cosas en la expresión regular: la palabra clave y todo después del signo = , se devuelve una lista de 2 tuplas.

El re.S le dice al motor de re.S regulares que permita el código de re.S regulares de todos los emparejamientos – . – incluir en la búsqueda la nueva línea de caracteres también, es decir, permitir el intervalo de búsqueda en varias líneas (lo que no es un comportamiento predeterminado).

Puedes usar una expresión regular para extraer todos los pares.

 >>> url = 'www2.domain.edu/folder/folder/page.php?l=user&x=0&id=1&page=http%3A//domain.com/page.html&unique=123456&refer=http%3A//domain2.net/results.aspx%3Fq%3Dbob+test+1.21+some%26file%3Dname&text=' >>> import re >>> url = 'www2.domain.edu/folder/folder/page.php?l=user&x=0&id=1&page=http%3A//domain.com/page.html&unique=123456&refer=http%3A//domain2.net/results.aspx%3Fq%3Dbob+test+1.21+some%26file%3Dname&text=' >>> p = re.compile('.*?&(.*?)=(.*?)(?=&|$)') >>> m = p.findall(url) >>> m [('x', '0'), ('id', '1'), ('page', 'http%3A//domain.com/page.html'), ('unique', '123456'), ('refer', 'http%3A//domain2.net/results.aspx%3Fq%3Dbob+test+1.21+some%26file%3Dname'), ('text', '')] 

Incluso puede utilizar una comprensión de dictado para empaquetar todos los datos juntos.

 >>> dic = {k:v for k,v in m} >>> dic {'text': '', 'page': 'http%3A//domain.com/page.html', 'x': '0', 'unique': '123456', 'id': '1', 'refer': 'http%3A//domain2.net/results.aspx%3Fq%3Dbob+test+1.21+some%26file%3Dname'} 

Y luego, si todo lo que quieres hacer es imprimirlos:

 >>> for k,v in dic.iteritems(): print k,'-->',v text --> page --> http%3A//domain.com/page.html x --> 0 unique --> 123456 id --> 1 refer --> http%3A//domain2.net/results.aspx%3Fq%3Dbob+test+1.21+some%26file%3Dname