2010-03-07 33 views
12

Voglio estrarre informazioni da una pagina web.utilizzando XPath per trovare il nodo sotto un nodo di contesto non funziona (firefox/firebug/javascript)

La pagina ha m nodi, che possono essere trovati da .valore ("// div [@ class = 'news']", documento, ....).

Per ognuno dei nodi precedenti, ci sono 3 nodi al loro interno. Ognuno di loro ha un selettore @class diverso. E voglio estrarre questi dischi con tre tuple.

Ho cercato di utilizzare la funzione Evaluate() come indicato in

https://developer.mozilla.org/en/Introduction_to_using_XPath_in_JavaScript

utilizzando questo codice

parentNodes = document.evaluate("//div[@class='news']", document, ....). 
while (true){ 
    var node = parentNodes.iterateNext(); 
    var child = document.evaluate("//div[@class='title']", node, ....). 
    ... 
} 

Tuttavia, "figlio" viene sempre assegnato al primo nodo del documento, anziché il primo nodo all'interno di "nodo".

Ho eseguito questo in console firebug.

Qualcuno sa cosa c'è che non va?

risposta

17

si sta chiamando valutare sul documento. Quindi l'espressione XPath viene valutata dalla radice dell'albero XML. Inoltre, se si desidera che XPath selezioni un nodo dal contesto corrente, ad es. tra i figli del nodo corrente è necessario utilizzare il selettore di contesto ".//"

+0

That "." di fronte era la chiave. Sembra strano per me che tu possa specificare un contesto, ma il percorso è ancora relativo alla radice. Scrollata di spalle. – dbreaux

+1

@dbreaux è come in linux shell, '/ bin/bash' punta alla directory di root indipendentemente da dove ti trovi, se hai un'altra dir chiamata bin nella tua directory corrente devi'./Bin/bash' o 'bin/bash' – Morad

6

Se si avvia un'espressione XPath con "/", si inizia dal nodo radice/nodo di documento del nodo di contesto. Quindi, invece di "//div[@class = 'title']" usa "descendant::div[@class = 'title']", in questo modo stai selezionando gli elementi div discendenti del nodo di contesto.

+0

Entrambi i metodi funzionano come un incantesimo. Grazie mille ragazzi !!! – manova

+3

BTW 'descendant :: div [@class = 'title']' è equivalente a './/div[@class = 'title']'. – Tomalak

0

È anche possibile utilizzare location path selectordescendant-or-self. In questo modo: per riferimento a partire dal nodo passato come contesto.

Spero di aver aiutato.

Problemi correlati