2009-11-19 18 views
12

Supponendo che ho un URL del prodotto Amazon in questo modoraschiare ASIN da URL amazon utilizzando 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 

Come potrei raschiare solo la ASIN utilizzando JavaScript? Grazie!

risposta

17

Le pagine di dettagli di Amazon possono avere diverse forme, quindi per essere esaurienti è necessario verificarle tutte. Queste sono tutte equivalenti:

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

Cercano sempre come questo o questo:

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

Questo dovrebbe farlo:

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

Un altro modulo possibile: amazon.com/exec/obidos/asin/B0015T963C. Per essere completamente completo, la regex potrebbe essere estesa con 'dp | gp/product | exec/obidos/asin'. – jpsimons

+5

Basandosi su questo, e l'aggiunta del supporto per i caratteri internazionali, porti dispari, https, domini non statunitensi, ei parametri di query/monitoraggio (e sto usando Java) sarebbe: modello asinPattern = modello \t \t \t .compile ???? ("^ (http [s]: //) ([\\ W.-] +) ([0-9] +)/([\\ w-%] + /) (dp | ?.? gp/prodotto | exec/Obidos/ASIN)/(\\ w + /) (\\ w {10}) (*) $ "); –

+0

Anche dopo l'aggiornamento di @ JasonThrasher, non funzionava ancora per l'URL: https://www.amazon.com/gp/aw/d/B00W36QH4C?me= & ref = olp_product_details # immersive-view_1438138820146 La soluzione di Gumbo sembrava sta lavorando per tutti i miei url –

-1

Se l'ASIN è sempre in quella posizione nella URL:

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

anche se probabilmente c'è poca probabilità di un ASIN ottenere% -escaped.

+0

Non è sempre in quella posizione. Gli URL di Amazon hanno molte forme, come http://www.amazon.com/dp/B0015T963C – ceejayoz

0

qualcosa come questo dovrebbe funzionare (non testato)

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

Il Wikipedia article on ASIN (che ho linkified nella tua domanda) dà le varie forme di URL Amazon. Puoi facilmente creare un'espressione regolare (o serie di essi) per recuperare questi dati usando il metodo match().

16

Poiché l'ASIN è sempre una sequenza di 10 lettere e/o numeri immediatamente dopo una barra, provate questo:

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

L'ulteriore (?:[/?]|$) dopo l'ASIN è assicurare che solo un segmento percorso completo viene acquistata .

+1

Ci sono diversi casi in cui non funziona: http://www.amazon.com/BEAUTBRIDE-Womens-Beaded-Wedding- Fingerless/dp/B010Q0Y92I ... http://www.amazon.com/LOSLANDIFEN-Elegant-Stiletto-Wedding-6041-04Silk42/dp/B019PMTJH8. Posso confermarlo perché stavo usando un approccio simile :) –

+0

@OscarMederos Lavora per me in entrambi i casi. – Gumbo

+0

Funziona alla grande https://jsfiddle.net/s6qsa6ph/ – Akam

1

@ Gumbo: Il tuo codice funziona benissimo!

// Test JS: testarlo in Firebug.

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

Aggiungo una funzione php che fa la stessa cosa.

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

realtà, la risposta in alto non funziona se si tratta di qualcosa di simile amazon.com/BlackBerry ... (dal BlackBerry è anche a 10 caratteri).

Una soluzione (assumendo che l'ASIN è sempre in maiuscolo, in quanto è quando prese sempre da Amazon) è (in Ruby):

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

ho trovato a lavorare su migliaia di URL.

+1

e non funziona su molti altri. Vedi il mio commento sulla risposta di Gumbo –

+0

@OscarMederos Dovrebbe funzionare su entrambi gli esempi che hai dato, perché l'ASIN è ancora 10 caratteri maiuscoli/numerici dopo un "/". Quindi non corrisponderebbe all'inizio dell'URL, ma corrisponderebbe comunque alla fine. Correggimi se ho torto – osman

+0

@osman ha ragione - il tuo esempio non funzionerà su alcuni link. Prova questo fuori - http://www.amazon.com/BEAUTBRIDE-Womens-Beaded-Wedding-Fingerless/dp/B010Q0Y92I. BEAUTBRIDE è di 10 caratteri, quindi corrisponderà a quello invece di B010Q0Y92I. – ecdeveloper

1

questo è il mio amazon universale ASIN regexp:

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

Ehi!È davvero bello, nitido e corto. Potresti spiegare il funzionamento di questo modello passo dopo passo? Questo sarebbe di grande aiuto. –

1

Nessuno del lavoro di cui sopra in tutti i casi. Ho cercato seguenti URL da abbinare con gli esempi di cui sopra:

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 

Questo è il meglio che ho potuto venire con: (?:[/dp/]|$)([A-Z0-9]{10}) che sarà anche selezionare il prepending/in tutti i casi. Questo può essere rimosso in seguito.

È possibile verificare su: http://regexr.com/3gk2s

0

Questo può essere un approccio semplicistico, ma devo ancora trovare un errore in esso utilizzando uno dei dell'URL del previsto in questa discussione che la gente dice è un problema.

Semplicemente, prendo l'URL, lo divido sulla "/" per ottenere le parti discrete. Quindi fai un loop del contenuto dell'array e rimbalzalo fuori dalla regex. Nel mio caso la variabile i rappresenta un oggetto che ha una proprietà chiamata RawURL per contenere l'url non elaborato con cui sto lavorando e una proprietà chiamata VendorSKU che sto compilando.

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) { } 

Finora, questo ha funzionato perfettamente.

Problemi correlati