2012-11-27 10 views
5

Sto usando google docs per il web scraping. Nello specifico, sto utilizzando i fogli Google incorporati nella funzione IMPORTXML in cui utilizzo XPath per selezionare i nodi da cui raschiare i dati.Istruzione condizionale semplice XPath? Se il nodo X esiste, fai Y?

Quello che sto cercando di fare è fondamentalmente controllare se esiste un nodo particolare, se SÌ, selezionare qualche altro nodo casuale.

risposta

7

Non hai una logica del genere in XPath, ma potresti essere in grado di fare qualcosa di simile a quello che desideri.

Se si desidera selezionare //table/tr/td[2]/a ma solo se ha un img[@class='special'] in esso, quindi è possibile utilizzare //table/tr/td[2]/a[img[@class='special']].

Se si desidera selezionare un altro nodo in qualche altra circostanza, si potrebbe sindacali due percorsi (l'operatore |), e solo fare in modo che ognuno ha un filtro (entro []) che è escludono a vicenda, come avere un essere un percorso e l'altro è not() di quel percorso. Darei un esempio, ma non sono sicuro di quale "altro nodo casuale" vorresti ... Forse potresti chiarire?

L'elemento chiave è pensare a XPath come a un linguaggio di query, non a una procedura, quindi è necessario pensare a selettori e filtri su di essi, che è un modo piuttosto diverso di pensare ai problemi rispetto alla maggior parte dei programmatori a. Ma il fatto che i filtri non debbano essere specificamente correlati al selettore (si può avere un filtro che inizia a guardare la radice del documento, ad esempio) porta ad alcune potenti possibilità (se difficili da leggere).

+0

grazie per la risposta. Fondamentalmente sto provando a controllare un percorso profondo come '// div/div/table/tr/td [2]/a/img [@ class =' ​​special ']' e se esiste recupera i dati dallo stesso percorso ma un pochi passi indietro: '// div/div/table/tr/td [2]/a' e NON elementi che non hanno una classe 'speciale' applicata al loro figlio: . – AnchovyLegend

+1

Quindi penso che // // table/tr/td [2]/a [img [@ class = 'special']] 'che ho menzionato sia il tipo di cosa che stai cercando. Ottiene solo gli elementi 'a' che hanno un elemento' img' che hanno una classe 'speciale'. –

1

Uso:

/self::node()[//table/tr/td[2]/a/img[@class='special']] 
    //table/tr/td[2]/a