2016-06-24 23 views
5

Mi sono imbattuto in un problema XPath un po 'complicato. Considerate questo codice HTML di una parte di una pagina web (io ho usato Imgur e sostituito del testo):XPath seleziona collegamenti immagine - link genitore href di img src solo se esiste, altrimenti seleziona img src link

<a href="//i.imgur.com/ahreflink.jpg" class="zoom"> 
    <img class="post-image-placeholder" src="//i.imgur.com/imgsrclink.jpg"> 
    </img> 
</a> 

Prima di tutto voglio cercare tutti img tag nel documento e che trovano la loro corrispondente src es. Successivamente, voglio verificare se il collegamento img src contiene un'estensione di file immagine (.jpeg, .jpg, .gif, .png). Se non contiene un'estensione dell'immagine, non afferrarla. In questo caso ha un'estensione dell'immagine. Ora vogliamo capire quale link vogliamo afferrare. Poiché esiste lo parent href, dovremmo prendere il link corrispondente.

risultato desiderato: //i.imgur.com/ahreflink.jpg

Ma ora diciamo che il parent href non esiste:

<a name="missing! oh no!"> 
    <img class="post-image-placeholder" src="//i.imgur.com/imgsrclink.jpg"> 
    </img> 
</a> 

Risultato desiderato: //i.imgur.com/imgsrclink.jpg

Come posso fare per costruire questo XPath? Se aiuta, sto anche usando Python (Scrapy) con XPath. Quindi se il problema deve essere separato, si può usare anche Python.

+0

Hai provato qualcosa finora? –

+0

Ho appena raggiunto la parte in cui controllo le estensioni di immagine dei link, ma sono confuso su come selezionare quale collegamento catturare. – dtgee

+0

Vuoi provare a ottenere il risultato interamente utilizzando XPath o hai un linguaggio di scripting che stai usando che puoi implementare con la logica? –

risposta

4

Questo è molto semplice da fare in una sola espressione XPath:

//a[not(@href)]/img/@src | //a[img]/@href 
+0

Wow, non ho mai pensato di dare la priorità a img src prima (senza) dato che a livello logico stiamo dando la priorità all'href in primo luogo. Sembra una soluzione promettente, anche se prima dovrei testarlo. – dtgee

+0

@dtgee Non c'è priorità, solo filtri. – o11c

4

Non è necessario farlo in una singola espressione XPath. Ecco un'implementazione specifica Scrapy omettendo il controllo estensione dell'immagine (a giudicare dai commenti, hai già capito che fuori):

images = response.xpath("//a/img") 
for image in images: 
    a_link = image.xpath("../@href").extract_first() 
    image_link = image.xpath("@src").extract_first() 

    print(a_link or image_link) 
+0

Ah, grazie. Immagino di essere rimasto bloccato in trance pensando di dover usare XPath solo per selezionare tutto. Imparerò da questo errore! – dtgee

+0

@dtgee Probabilmente * do * voglio farlo in xpath, per mantenere il pesante sollevamento in C piuttosto che in Python. – o11c

+0

Vero. L'uso di Python rende il codice molto più leggibile, ma suppongo che l'utilizzo di XPath e l'aggiunta di alcuni commenti abbiano lo stesso scopo. – dtgee