2009-11-19 11 views
12

Suponiendo que tengo una URL del producto de Amazon como talraspadura ASIN de URL Amazon usando javascript

http://www.amazon.com/Kindle-Wireless-Reading-Display-Generation/dp/B0015T963C/ref=amb_link_86123711_2?pf_rd_m=ATVPDKIKX0DER&pf_rd_s=center-1&pf_rd_r=0AY9N5GXRYHCADJP5P0V&pf_rd_t=101&pf_rd_p=500528151&pf_rd_i=507846 

¿Cómo podría raspar sólo el ASIN usando javascript? Gracias!

Respuesta

17

Las páginas de detalles de Amazon pueden tener varias formas, por lo que para ser exhaustivo, debe verificarlas todas. Estas son todas equivalentes:

http://www.amazon.com/Kindle-Wireless-Reading-Display-Generation/dp/B0015T963C
http://www.amazon.com/dp/B0015T963C
http://www.amazon.com/gp/product/B0015T963C
http://www.amazon.com/gp/product/glance/B0015T963C

Siempre se parecen a esto o esto:

http://www.amazon.com/<SEO STRING>/dp/<VIEW>/ASIN 
http://www.amazon.com/gp/product/<VIEW>/ASIN 

Esto debe hacerlo:

var url = "http://rads.stackoverflow.com/amzn/click/B0015T963C"; 
var regex = RegExp("http://www.amazon.com/([\\w-]+/)?(dp|gp/product)/(\\w+/)?(\\w{10})"); 
m = url.match(regex); 
if (m) { 
    alert("ASIN=" + m[4]); 
} 
+1

Una forma más posible: amazon.com/exec/obidos/asin/B0015T963C. Solo para ser completamente completo, la expresión regular podría extenderse con 'dp | gp/product | exec/obidos/asin'. – jpsimons

+5

Basándose en esto, y la adición de soporte para caracteres internacionales, puertos impares, https, dominios que no son estadounidenses, y los parámetros de consulta/seguimiento (y estoy usando Java) sería: Patrón asinPattern = Patrón \t \t \t .compile ("^ (http [s]?: //)? ([\\ w.-] +) (: [0-9] +)?/([\\ w-%] + /)? (dp | gp/product | exec/obidos/asin)/(\\ w + /)? (\\ w {10}) (. *)? $ "); –

+0

Incluso después de la actualización de @ JasonThrasher, todavía no funcionaba para la url: https://www.amazon.com/gp/aw/d/B00W36QH4C?me= & ref = olp_product_details # inmersión-vista_1438138820146 La solución de Gumbo parecía estar trabajando para todas mis direcciones URL –

-1

Si el ASIN está siempre en esa posición en la URL:

var asin= decodeURIComponent(url.split('/')[5]); 

aunque es probable que haya pocas posibilidades de conseguir un ASIN% -escape.

+0

No siempre está en esa posición. Las URL de Amazon tienen muchas formas, como http://www.amazon.com/dp/B0015T963C – ceejayoz

0

algo como esto debería funcionar (no probado)

var match = /\/dp\/(.*?)\/ref=amb_link/.exec(amazon_url); 
var asin = match ? match[1] : ''; 
0

El Wikipedia article on ASIN (que he linkified en su pregunta) da las diversas formas de direcciones URL de Amazon. Puede crear fácilmente una expresión regular (o una serie de ellas) para obtener estos datos utilizando el método match().

16

Desde el ASIN siempre es una secuencia de 10 letras y/o números inmediatamente después de una barra, intente esto:

url.match("/([a-zA-Z0-9]{10})(?:[/?]|$)") 

El adicional (?:[/?]|$) después de la ASIN es asegurar que sólo se toma un segmento de ruta completa .

+1

Hay varios casos en los que no funciona: http://www.amazon.com/BEAUTBRIDE-Womens-Beaded-Wedding- Fingerless/dp/B010Q0Y92I ... http://www.amazon.com/LOSLANDIFEN-Elegant-Stiletto-Wedding-6041-04Silk42/dp/B019PMTJH8. Puedo confirmarlo porque estaba usando un enfoque similar :) –

+0

@OscarMederos Funciona para mí en ambos casos. – Gumbo

+0

Funciona muy bien https://jsfiddle.net/s6qsa6ph/ – Akam

1

@Gumbo: ¡Tu código funciona muy bien!

// Prueba JS: pruébelo en firebug.

url = window.location.href; 
url.match("/([a-zA-Z0-9]{10})(?:[/?]|$)"); 

Agrego una función php que hace lo mismo.

function amazon_get_asin_code($url) { 
    global $debug; 

    $result = ""; 

    $pattern = "([a-zA-Z0-9]{10})(?:[/?]|$)"; 
    $pattern = escapeshellarg($pattern); 

    preg_match($pattern, $url, $matches); 

    if($debug) { 
     var_dump($matches); 
    } 

    if($matches && isset($matches[1])) { 
     $result = $matches[1]; 
    } 

    return $result; 
} 
7

realidad, la respuesta arriba no funciona si se trata de algo así como amazon.com/BlackBerry ... (ya que BlackBerry es también de 10 caracteres).

Una solución (suponiendo que el ASIN siempre se escribe con mayúscula, ya que siempre está cuando se toma en Amazon) es (en Ruby):

 url.match("/([A-Z0-9]{10})") 

lo he encontrado para trabajar en miles de direcciones URL.

+1

y no funciona en muchos otros. Ver mi comentario sobre la respuesta de Gumbo –

+0

@OscarMederos Debería trabajar en ambos ejemplos, ya que ASIN todavía tiene 10 letras mayúsculas/numéricas después de "/". Por lo tanto, no coincidiría con el comienzo de la URL, pero igual coincidiría con el final. Corrígeme si me equivoco – osman

+0

@osman tiene razón; su ejemplo no funcionará en algunos enlaces. Prueba este: http://www.amazon.com/BEAUTBRIDE-Womens-Beaded-Wedding-Fingerless/dp/B010Q0Y92I. BEAUTBRIDE tiene 10 caracteres, por lo que coincidirá con ese en lugar de B010Q0Y92I. – ecdeveloper

1

esta es mi Amazon universal de expresión regular ASIN:

~(?:\b)((?=[0-9a-z]*\d)[0-9a-z]{10})(?:\b)~i 
+0

¡Oye!Es realmente bonito, nítido y corto. ¿Podría explicar el funcionamiento de este patrón paso a paso? Eso sería una gran ayuda. –

1

Ninguno de los trabajos más arriba en todos los casos. He tratado siguientes direcciones para que coincida con los ejemplos anteriores:

http://www.amazon.com/Kindle-Wireless-Reading-Display-Generation/dp/B0015T963C 
http://www.amazon.com/dp/B0015T963C 
http://www.amazon.com/gp/product/B0015T963C 
http://www.amazon.com/gp/product/glance/B0015T963C 

https://www.amazon.de/gp/product/B00LGAQ7NW/ref=s9u_simh_gw_i1?ie=UTF8&pd_rd_i=B00LGAQ7NW&pd_rd_r=5GP2JGPPBAXXP8935Q61&pd_rd_w=gzhaa&pd_rd_wg=HBg7f&pf_rd_m=A3JWKAKR8XB7XF&pf_rd_s=&pf_rd_r=GA7GB6X6K6WMJC6WQ9RB&pf_rd_t=36701&pf_rd_p=c210947d-c955-4398-98aa-d1dc27e614f1&pf_rd_i=desktop 

https://www.amazon.de/Sawyer-Wasserfilter-Wasseraufbereitung-Outdoor-Filter/dp/B00FA2RLX2/ref=pd_sim_200_3?_encoding=UTF8&psc=1&refRID=NMR7SMXJAKC4B3MH0HTN 

https://www.amazon.de/Notverpflegung-Kg-Marine-wasserdicht-verpackt/dp/B01DFJTYSQ/ref=pd_sim_200_5?_encoding=UTF8&psc=1&refRID=7QM8MPC16XYBAZMJNMA4 

https://www.amazon.de/dp/B01N32MQOA?psc=1 

Esto es lo mejor que podía llegar a: (?:[/dp/]|$)([A-Z0-9]{10}) Lo que también se seleccionará el prepending/en todos los casos. Esto se puede eliminar más adelante.

Puede probarlo en: http://regexr.com/3gk2s

0

Esto puede ser un enfoque simplista, pero todavía tienen que encontrar un error en ella usando cualquiera de la URL del proporcionada en este hilo de la gente es un problema.

Simplemente, tomo la URL, la divido en "/" para obtener las partes discretas. A continuación, recorra los contenidos de la matriz y rebánelos de la expresión regular. En mi caso, la variable i representa un objeto que tiene una propiedad llamada RawURL para contener la url en bruto con la que estoy trabajando y una propiedad llamada VendorSKU que estoy poblando.

try 
      { 
       string[] urlParts = i.RawURL.Split('/'); 
       Regex regex = new Regex(@"^[A-Z0-9]{10}"); 

       foreach (string part in urlParts) 
       { 
        Match m = regex.Match(part); 
        if (m.Success) 
        { 
         i.VendorSKU = m.Value; 
        } 
       } 
      } 
      catch (Exception) { } 

Hasta ahora, esto ha funcionado a la perfección.