2010-03-07 18 views
12

Bir web sayfasından bilgi almak istiyorum.çalışmıyor (firefox/firebug/javascript)

Sayfanın, ".log" ("// div [@ class = 'news']", document, ....) tarafından bulunabilen m nodları vardır.

Yukarıdaki düğümlerin her biri için, bunların içinde 3 düğüm vardır. Her birinin farklı @class seçici var. Ve bu 3-tuple kayıtlarını çıkarmak istiyorum.

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

Ancak, "çocuk" her zaman ilk düğüme atanan bu kodu kullanarak

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

anlatıldığı gibi

ben .evaluate() işlevini kullanmaya çalıştı belge, "düğüm" içindeki ilk düğüm yerine.

Bunu, firebug konsolunda çalıştırdım.

Sorun nedir?

cevap

17

Belgede değerlendirme çağırıyorsunuz. Bu nedenle, XPath ifadesi XML ağacının kökünden değerlendirilmektedir. Ayrıca, XPath'in geçerli bağlamı örten bir düğümü seçmesini isterseniz, ör. Geçerli düğümün çocukları arasında ".//" bağlam seçicisini kullanmalısınız.

+0

Bu "." önünde anahtar vardı. Bana bir bağlam belirtebilirsiniz garip görünüyor, ama hala köküne göre yoldur. Omuz silkme. – dbreaux

+1

@dbreaux linux kabuğunda olduğu gibi, '/ bin/bash' nerede olursanız olun kök dizinine yönlendirirseniz, eğer şu anki dizininizde bin olarak adlandırılan başka bir direk varsa'/bin/bash' veya bin/bash' – Morad

6

"/" ile bir XPath ifadesi başlatırsanız, bağlam düğümünün kök düğüm/belge düğümünden başlıyorsunuz demektir. Yani "//div[@class = 'title']" yerine, "descendant::div[@class = 'title']" kullanın, bu şekilde bağlamsal düğümün descendant div öğelerini seçersiniz.

+0

Her iki yöntem de bir çekicilik gibi çalışır. Çok teşekkür ederim çocuklar! – manova

+3

BTW 'descendant :: div [@class = 'title']' .//div[@class = 'title'] 'ile eşdeğerdir. – Tomalak

0

Ayrıca location path selectordescendant-or-self'u da kullanabilirsiniz. Bunun gibi: bağlam olarak geçirilen düğümün başlatılması için descendant-or-self::div....

Umarım yardımcı olmuşumdur.