Encontrar el sitio de comercio electrónico de la URL del producto dada y ver si es compatible -- python campo con url camp codereview Relacionados El problema

Finding e-commerce site of the product URL given and see if it is supported


3
vote

problema

Español

Estoy construyendo una aplicación Python en la que el usuario puede mantener la lista de deseos de los productos. Solo apoyo a pocos sitios de comercio electrónico y no es compatible con los sitios específicos del país (por ejemplo, puedo apoyar a Amazon.com pero no amazon.in). No soporte la versión móvil de la URL (por ejemplo, http://m.amazon.com ) y también soy No está interesado en la parte de la cadena de consulta de la URL (y no lo quiero también).

Siguiendo es el código y también los casos de prueba. Aunque parece estar trabajando, no estoy contento con el código. Me parece hackeado. Realmente apreciaría mejorar la función get_vendor . ¿Te encuentras legible?

  from urlparse import urlparse  supported_vendors = ['flipkart.com', 'homeshop18.com', 'snapdeal.com',                      'myntra.com', 'www.flipkart.com', 'www.homeshop18.com',                      'www.snapdeal.com', 'www.myntra.com']  test_urls =['http://www.myntra.com/sports-shoes/puma/puma-men-grey-kuris-ii-ind-running-shoes/107455/buy?searchQuery=sports-shoes&serp=1&uq=false#!',             'www.myntra.com/sports-shoes/puma/puma-men-grey-kuris-ii-ind-running-shoes/107455/buy?searchQuery=sports-shoes&serp=1&uq=false#!',             'https://myntra.com/sports-shoes/puma/puma-men-grey-kuris-ii-ind-running-shoes/107455/buy?searchQuery=sports-shoes&serp=1&uq=false#!',             'http://.myntra.com/sports-shoes/puma/puma-men-grey-kuris-ii-ind-running-shoes/107455/buy?searchQuery=sports-shoes&serp=1&uq=false#!',             'htt://www.myntra.com/sports-shoes/puma/puma-men-grey-kuris-ii-ind-running-shoes/107455/buy?searchQuery=sports-shoes&serp=1&uq=false#!',             'http://blahblah.com/sports-shoes/puma/puma-men-grey-kuris-ii-ind-running-shoes/107455/buy?searchQuery=sports-shoes&serp=1&uq=false#!',             'ftp://myntra.com/sports-shoes/puma/puma-men-grey-kuris-ii-ind-running-shoes/107455/buy?searchQuery=sports-shoes&serp=1&uq=false#!']  test_expected_results = [True, True, True, False, False, False, False]  def get_vendor(url):     def add_http(url):         return 'http://'+url      def get_url(parsed_url):         return 'http://'+parsed_url.netloc+parsed_url.path      if not urlparse(url).scheme:         parsed_url = urlparse(add_http(url))     elif urlparse(url).scheme not in ['http', 'https']:         return (None, url)     else:         parsed_url = urlparse(url)     if parsed_url.netloc not in supported_vendors:         return (None, url)     else:         return (parsed_url.netloc, get_url(parsed_url))   if __name__ == '__main__':     # for i in map(get_vendor, test_urls):     #     print i     assert(map(lambda x: bool(x[0]), map(get_vendor, test_urls)) == test_expected_results)   

Basado en lo que devuelve el proveedor. Aplico diferentes funciones de raspado. Aquí está el siguiente código:

  HS18 = ['homeshop18.com', 'www.homeshop18.com'] SD = ['snapdeal.com', 'www.snapdeal.com'] FS = ['flipkart.com', 'www.flipkart.com'] MYN = ['myntra.com', 'www.myntra.com']  vendor, url = get_vendor(url)  if not vendor:     exit # or throw error  product_doc = search_for_url_in_database(url)  if not product_doc:     if vendor in FS:         product_url, product_name, product_img_url, product_price = get_flipkart_product_meta(url)     elif vendor in HS18:         product_url, product_name, product_img_url, product_price = get_homeshop18_product_meta(url)     elif vendor in SD:         product_url, product_name, product_img_url, product_price = get_snapdeal_product_meta(url)     else:         product_url, product_name, product_img_url, product_price = get_myntra_product_meta(url)  ...   

Este último si el bloqueo puedo cambiarlo a:

  if not product_doc:     if vendor in FS:         get_product_meta = get_flipkart_product_meta     elif vendor in HS18:         get_product_meta = get_homeshop18_product_meta     elif vendor in SD:         get_product_meta = get_snapdeal_product_meta     else:         get_product_meta = get_myntra_product_meta     product_url, product_name, product_img_url, product_price = get_product_meta(url)  ...   
  1. ¿Qué dice sobre este segundo if donde estoy asignando un objeto de función a una variable y llámalo más tarde? ¿Debo estar haciendo así? ¿Cuál es la forma sugerida?

  2. Las listas definidas en la parte superior, tiene datos redundantes. ¿Hay alguna manera de hacerlo mejor?

  3. A eso me gustaría mantener el líder www Si la URL tiene (aunque evite esto, no haga daño). Entonces, ¿cómo hago esto con la forma más limpia? O sugiere eliminar www Completamente?

En general, ¿cómo manejan esta situación como esta, cuando tiene que llamar a una función basada en los bloques if -ses?

Editar : el siguiente código fue sugerido por alguien en Reddit. Me parece limpio:

  PRODUCT_METAS = {     'homeshop18.com': get_homeshop18_product_meta,     'snapdeal.com': get_snapdeal_product_meta,     'flipkart.com': get_flipkart_product_meta,    ' myntra.com': get_myntra_product_meta, }  vendor, url = get_vendor(url) if vendor is None:     exit()  product_doc = search_for_url_in_database(url)  if not product_doc:     if vendor.startswith('www.'):         vendor = vendor[len('www.'):]     try:         product_url, product_name, product_img_url, product_price = PRODUCT_METAS[vendor](url)     except KeyError:         exit   
Original en ingles

I am building a Python app in which user can maintain wishlist of the products. I only support few e-commerce sites and do not support country specific sites (e.g I may support amazon.com but not amazon.in). I do not support mobile version of the URL (e.g. http://m.amazon.com) and also I am not interested in the query string part of the URL (and I don't want it also).

Following is the code and also the test cases. Though it seems to be working, I am not happy with the code. It looks hackish to me. I would really appreciate improving get_vendor function. Do you find it readable?

from urlparse import urlparse  supported_vendors = ['flipkart.com', 'homeshop18.com', 'snapdeal.com',                      'myntra.com', 'www.flipkart.com', 'www.homeshop18.com',                      'www.snapdeal.com', 'www.myntra.com']  test_urls =['http://www.myntra.com/sports-shoes/puma/puma-men-grey-kuris-ii-ind-running-shoes/107455/buy?searchQuery=sports-shoes&serp=1&uq=false#!',             'www.myntra.com/sports-shoes/puma/puma-men-grey-kuris-ii-ind-running-shoes/107455/buy?searchQuery=sports-shoes&serp=1&uq=false#!',             'https://myntra.com/sports-shoes/puma/puma-men-grey-kuris-ii-ind-running-shoes/107455/buy?searchQuery=sports-shoes&serp=1&uq=false#!',             'http://.myntra.com/sports-shoes/puma/puma-men-grey-kuris-ii-ind-running-shoes/107455/buy?searchQuery=sports-shoes&serp=1&uq=false#!',             'htt://www.myntra.com/sports-shoes/puma/puma-men-grey-kuris-ii-ind-running-shoes/107455/buy?searchQuery=sports-shoes&serp=1&uq=false#!',             'http://blahblah.com/sports-shoes/puma/puma-men-grey-kuris-ii-ind-running-shoes/107455/buy?searchQuery=sports-shoes&serp=1&uq=false#!',             'ftp://myntra.com/sports-shoes/puma/puma-men-grey-kuris-ii-ind-running-shoes/107455/buy?searchQuery=sports-shoes&serp=1&uq=false#!']  test_expected_results = [True, True, True, False, False, False, False]  def get_vendor(url):     def add_http(url):         return 'http://'+url      def get_url(parsed_url):         return 'http://'+parsed_url.netloc+parsed_url.path      if not urlparse(url).scheme:         parsed_url = urlparse(add_http(url))     elif urlparse(url).scheme not in ['http', 'https']:         return (None, url)     else:         parsed_url = urlparse(url)     if parsed_url.netloc not in supported_vendors:         return (None, url)     else:         return (parsed_url.netloc, get_url(parsed_url))   if __name__ == '__main__':     # for i in map(get_vendor, test_urls):     #     print i     assert(map(lambda x: bool(x[0]), map(get_vendor, test_urls)) == test_expected_results) 

based on what vendor returns I apply different scraping functions. Here is the next code:

HS18 = ['homeshop18.com', 'www.homeshop18.com'] SD = ['snapdeal.com', 'www.snapdeal.com'] FS = ['flipkart.com', 'www.flipkart.com'] MYN = ['myntra.com', 'www.myntra.com']  vendor, url = get_vendor(url)  if not vendor:     exit # or throw error  product_doc = search_for_url_in_database(url)  if not product_doc:     if vendor in FS:         product_url, product_name, product_img_url, product_price = get_flipkart_product_meta(url)     elif vendor in HS18:         product_url, product_name, product_img_url, product_price = get_homeshop18_product_meta(url)     elif vendor in SD:         product_url, product_name, product_img_url, product_price = get_snapdeal_product_meta(url)     else:         product_url, product_name, product_img_url, product_price = get_myntra_product_meta(url)  ... 

This last if block I can change it to:

if not product_doc:     if vendor in FS:         get_product_meta = get_flipkart_product_meta     elif vendor in HS18:         get_product_meta = get_homeshop18_product_meta     elif vendor in SD:         get_product_meta = get_snapdeal_product_meta     else:         get_product_meta = get_myntra_product_meta     product_url, product_name, product_img_url, product_price = get_product_meta(url)  ... 
  1. What do you say about this second if block where I am assigning function object to a variable and calling it later. Should I be doing like this? What's the suggested way?

  2. The lists defined at top, has redundant data. Is there any way to make it better?

  3. I really would like to keep leading www if the url has (even though avoiding this do not harm). So how do I do this with cleaner way? or you suggest to remove www completely?

Generally how do you guys handle situation like this, when you have to call a function based on if-else blocks?

EDIT: Following code was suggested by someone on reddit. Looks clean to me:

PRODUCT_METAS = {     'homeshop18.com': get_homeshop18_product_meta,     'snapdeal.com': get_snapdeal_product_meta,     'flipkart.com': get_flipkart_product_meta,    ' myntra.com': get_myntra_product_meta, }  vendor, url = get_vendor(url) if vendor is None:     exit()  product_doc = search_for_url_in_database(url)  if not product_doc:     if vendor.startswith('www.'):         vendor = vendor[len('www.'):]     try:         product_url, product_name, product_img_url, product_price = PRODUCT_METAS[vendor](url)     except KeyError:         exit 
     
   
   

Lista de respuestas

3
 
vote

Las dos funciones de ayuda se sienten redundantes para mí; 'http://'+url55544335 es lo suficientemente claro como es, y hay un módulo 99887776555443367655443367665544337 .

Mi propuesta:

  def get_vendor(url):     parsed_url = urlparse(url)     if not parsed_url.scheme:         parsed_url = urlparse('http://'+url)      scheme, netloc, path, params, query, fragment = parsed_url      if scheme in ['http', 'https'] and netloc in supported_vendors:         return (netloc, urlunparse((scheme, netloc, path, '','','')))     else:         return (None, url)   

Para tratar con un 9988776655544339 99887766655443310 agregándolo de manera programática a cada URL conocida. Ahora, si necesitaba agregar un proveedor que solo está disponible con o sin PATH=something1 , solo tendría que cambiar esto de la lista y agregar a esa lista.

  PATH=something2  
 

The two helper functions feel redundant to me; 'http://'+url is clear enough as is, and there is an urlunparse in urlparse module.

My proposal:

def get_vendor(url):     parsed_url = urlparse(url)     if not parsed_url.scheme:         parsed_url = urlparse('http://'+url)      scheme, netloc, path, params, query, fragment = parsed_url      if scheme in ['http', 'https'] and netloc in supported_vendors:         return (netloc, urlunparse((scheme, netloc, path, '','','')))     else:         return (None, url) 

To deal with an optional www. in front, you could avoid complicating the get_vendor function by adding it programmatically to each known URL. Now, if you needed to add a vendor that's only available with or without www., you would only have to change this back how it was and add to that list.

supported_vendors = ['flipkart.com', 'homeshop18.com', 'snapdeal.com',                       'myntra.com'] supported_vendors += ['www.' + x for x in supported_vendors] 
 
 
   
   

Relacionados problema

2  Lea el archivo con URL para conectarse a ellos, buscar patrones y generar salida en envase multi-enhebrado  ( Read file with urls to connect to them search for patterns and generate output ) 
He estado implementando una pequeña aplicación que leerá un archivo de texto que mantiene las direcciones de URL (una dirección por línea). Ejemplo: http...

9  Dividir la cadena de consulta de URL a pares de valor clave  ( Splitting url query string to key value pairs ) 
Tengo una cadena de consulta de URL "key={value}&key2={value2}&key3={value3}" y tiene que producir un par de valores clave de la cadena dividiendo & y ex...

9  Serializando los datos de JSON provenientes de dos URL en el mismo objeto  ( Serializing json data coming from two urls in the same object ) 
Tengo dos URL ( urlA y urlB ) y la URL me devuelve una respuesta JSON en el mismo formato JSON. A continuación se muestra mi cadena JSON a la que me estoy v...

3  Análisis de la consulta de URL y adjuntándola al final de la otra URL  ( Parsing url query and appending it at end of the other url ) 
Estoy tratando de agarrar la consulta de la URL de la URL que está en la barra de direcciones del navegador, luego agregarlo al final de la otra URL y hacerlo...

1  Un analizador URI (completo) para Python  ( A comprehensive uri parser for python ) 
Para un desafío de código, estoy tratando de escribir un analizador de URI completo en Python que maneja ambos URIS con public class RingBuffer{ private ...

3  Creando y analizando cadenas de consulta  ( Creating and parsing query strings ) 
En un momento de aburrimiento, decidí escribir dos métodos, uno de los cuales crearía una cadena de consulta, mientras que el otro lo analizaría, la restricci...

14  Pista de ruta de solicitud HTTP  ( Http request path parser ) 
He escrito un método para tokenizar las rutas de solicitud HTTP, como /employee/23/edit : protected void compile(String path){ int mark=0; for(int...

3  Configuración de un convertidor de divisas para obtener feeds de tipo de cambio para varias monedas  ( Configuring a currency converter to get exchange rate feeds for for multiple cur ) 
Estoy tratando de hacer que mi función sea más versátil al eliminar los datos codificados duros. function get_currency_rate($currencySource) { if (isset($...

7  URLS de canónico para el sitio web estático  ( Canonicalize urls for static website ) 
Quiero las URLs "Canonicalize" para mi sitio web estático (archivos y carpetas). Los 'objetivos' describe lo que quiero lograr. El 'Código' le da a mi actua...

3  Mostrando el dominio de una URL  ( Showing the domain of a url ) 
Tengo un método de este tipo que toma una URL, como http://twitter.com/ttt o Twitter.com/DASD, y debe mostrar su dominio con http: http://twitter.com y no...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos