¿Cómo elimino una consulta de una url?

Estoy utilizando scrapy para rastrear un sitio que parece estar agregando valores aleatorios a la cadena de consulta al final de cada URL. Esto está convirtiendo el rastreo en una especie de bucle infinito.

¿Cómo hago scrapy para descuidar la parte de la cadena de consulta de las URL?

Ver urllib.urlparse

Código de ejemplo:

from urlparse import urlparse o = urlparse('http://url.something.com/bla.html?querystring=stuff') url_without_query_string = o.scheme + "://" + o.netloc + o.path 

Ejemplo de salida:

 Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) [GCC 4.2.1 (Apple Inc. build 5646)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> from urlparse import urlparse >>> o = urlparse('http://url.something.com/bla.html?querystring=stuff') >>> url_without_query_string = o.scheme + "://" + o.netloc + o.path >>> print url_without_query_string http://url.something.com/bla.html >>> 

Hay una función url_query_cleaner en el módulo w3lib.url (utilizada por el propio scrapy) para limpiar las URL que solo mantienen una lista de argumentos permitidos.

Proporcione un código, para que podamos ayudarle.

Si está utilizando CrawlSpider y Rule ‘s con SgmlLinkExtractor , proporcione una función personalizada al parámetro proccess_value del constructor SgmlLinkExtractor .

Consulte la documentación de BaseSgmlLinkExtractor.

 def delete_random_garbage_from_url(url): cleaned_url = ... # process url somehow return cleaned_url Rule( SgmlLinkExtractor( # ... your allow, deny parameters, etc process_value=delete_random_garbage_from_url, ) ) 

Puede usar la función urllib.parse.urlsplit() . El resultado es un resultado de análisis estructurado , una tupla nombrada con funcionalidad agregada.

Use el método namedtuple._replace() para alterar los valores de los resultados analizados, luego use el método SplitResult.geturl() para obtener una cadena de URL nuevamente.

Para eliminar la cadena de consulta, establezca el valor de query en None :

 from urllib.parse import urlsplit updated_url = urlsplit(url)._replace(query=None).geturl() 

Manifestación:

 >>> from urllib.parse import urlsplit >>> url = 'https://example.com/example/path?query_string=everything+after+the+questionmark' >>> urlparse.urlsplit(url)._replace(query=None).geturl() 'https://example.com/example/path' 

Para Python 2, la misma función está disponible bajo el nombre urlparse.urlsplit() .

También puede usar la función urllparse.parse.urlparse() ; para las URL sin ningún parámetro de ruta , el resultado sería el mismo. Las dos funciones difieren en cómo se manejan los parámetros del camino; urlparse() solo admite parámetros de ruta para el último segmento de la ruta, mientras que urlsplit() deja parámetros de ruta en su lugar en la ruta, dejando el análisis de dichos parámetros a otro código. Dado que los parámetros de ruta rara vez se usan en estos días [las RFC posteriores han eliminado la característica por completo), la diferencia es fundamental urlparse() usa urlsplit() y sin parámetros, no agrega nada más que sobrecarga adicional. Es mejor simplemente usar urlsplit() directamente.

Si está utilizando BaseSpider, antes de generar una nueva solicitud, elimine valores aleatorios manualmente de la parte de consulta de la URL mediante urlparse :

 def parse(self, response): hxs = HtmlXPathSelector(response) item_urls = hxs.select(".//a[@class='...']/@href").extract() for item_url in item_urls: # remove the bad part of the query part of the URL here item_url = urlparse.urljoin(response.url, item_url) self.log('Found item URL: %s' % item_url) yield Request(item_url, callback = self.parse_item) 

Utilice este método para eliminar la cadena de consulta de url

 urllink="http://url.something.com/bla.html?querystring=stuff" url_final=urllink.split('?')[0] print(url_final) 

la salida será: http://url.something.com/bla.html