2008-11-03 24 views
8

Estoy trabajando con una gran lista de URL. Sólo una pregunta rápida que he intentando cortar una parte de la URL cabo, ver más abajo:Cortando URL con Python

http://www.domainname.com/page?CONTENT_ITEM_ID=1234&param2&param3 

¿Cómo podría cortar a cabo:

http://www.domainname.com/page?CONTENT_ITEM_ID=1234 

A veces hay más de dos parámetros después del CONTENT_ITEM_ID y la identificación es diferente cada vez, estoy pensando que se puede hacer encontrando el primer & y luego cortando los caracteres antes de ese &, no estoy seguro de cómo hacer esto.

Saludos

Respuesta

14

Utilice el módulo urlparse. Marque esta función:

import urlparse 

def process_url(url, keep_params=('CONTENT_ITEM_ID=',)): 
    parsed= urlparse.urlsplit(url) 
    filtered_query= '&'.join(
     qry_item 
     for qry_item in parsed.query.split('&') 
     if qry_item.startswith(keep_params)) 
    return urlparse.urlunsplit(parsed[:3] + (filtered_query,) + parsed[4:]) 

En su ejemplo:

>>> process_url(a) 
'http://www.domainname.com/page?CONTENT_ITEM_ID=1234' 

Esta función tiene la ventaja añadida de que es más fácil de usar si decide que también quiere más parámetros de consulta, o si el orden de los parámetros no es fijo, como en:

>>> url='http://www.domainname.com/page?other_value=xx&param3&CONTENT_ITEM_ID=1234&param1' 
>>> process_url(url, ('CONTENT_ITEM_ID', 'other_value')) 
'http://www.domainname.com/page?other_value=xx&CONTENT_ITEM_ID=1234' 
1

lo he descubierto a continuación es lo que tenía que hacer:

url = "http://www.domainname.com/page?CONTENT_ITEM_ID=1234&param2&param3" 
url = url[: url.find("&")] 
print url 
'http://www.domainname.com/page?CONTENT_ITEM_ID=1234' 
+0

Tenga cuidado con esto - si no hay parámetros (no "&"), simplemente soltará el último carácter de la url. –

+0

Consulte http://stackoverflow.com/questions/229352/python-find-question para obtener una mejor solución. –

+0

Ah, veo cómo eso podría ser un problema y gracias por la advertencia. La lista que estoy usando siempre tiene un parámetro después, pero lo tendré en cuenta para el futuro. :) – RailsSon

0
import re 
url = 'http://www.domainname.com/page?CONTENT_ITEM_ID=1234&param2&param3' 
m = re.search('(.*?)&', url) 
print m.group(1) 
4

La solución rápida y sucia es la siguiente:

>>> "http://something.com/page?CONTENT_ITEM_ID=1234&param3".split("&")[0] 
'http://something.com/page?CONTENT_ITEM_ID=1234' 
3

Otra opción sería para usar la función de división, con & como parámetro. De esta forma, extraería la url base y ambos parámetros.

url.split("&") 

devuelve una lista con

['http://www.domainname.com/page?CONTENT_ITEM_ID=1234', 'param2', 'param3'] 
0

Este método no depende de la posición del parámetro dentro de la cadena url. Esto podría ser refinado, estoy seguro, pero hace entender el punto.

url = 'http://www.domainname.com/page?CONTENT_ITEM_ID=1234&param2&param3' 
parts = url.split('?') 
id = dict(i.split('=') for i in parts[1].split('&'))['CONTENT_ITEM_ID'] 
new_url = parts[0] + '?CONTENT_ITEM_ID=' + id 
1

URL de Parsin nunca es tan simple como parece, por eso están los módulos urlparse y urllib.

Ejem:

import urllib 
url ="http://www.domainname.com/page?CONTENT_ITEM_ID=1234&param2&param3" 
query = urllib.splitquery(url) 
result = "?".join((query[0], query[1].split("&")[0])) 
print result 
'http://www.domainname.com/page?CONTENT_ITEM_ID=1234' 

Esto todavía no es 100% fiable, pero mucho más que dividir por sí mismo, porque hay una gran cantidad de formato de URL válida que tú y yo no conoce y descubre un día registros de errores

0

Una cuestión antigua, pero aún así, me gustaría remarcar que paramenters cadena de consulta también se puede separadas por ';' no solo '&'.

0

beside urlparse también hay furl que tiene una mejor API en mi humilde lugar.

Cuestiones relacionadas