2010-03-07 37 views
12

Tôi muốn trích xuất thông tin từ một trang web.sử dụng XPath để tìm nút dưới nút ngữ cảnh không hoạt động (firefox/firebug/javascript)

Trang có các nút m, có thể tìm thấy bằng .evaluate ("// div [@ class = 'news']", document, ....).

Đối với mỗi nút ở trên, có 3 nút bên trong chúng. Mỗi người trong số họ có bộ chọn @class khác nhau. Và tôi muốn trích xuất các bản ghi m 3-tuple này.

Tôi cố gắng để sử dụng .evaluate() chức năng theo hướng dẫn trong

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

bằng cách sử dụng mã này

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

Tuy nhiên, "con" luôn được gán cho nút đầu tiên trong tài liệu, thay vì nút đầu tiên trong "nút".

Tôi đã chạy điều này trong bảng điều khiển firebug.

Có ai biết điều gì sai?

Trả lời

17

bạn đang gọi đánh giá trên tài liệu. Do đó biểu thức XPath đang được đánh giá từ gốc của cây XML. Ngoài ra, nếu bạn muốn XPath chọn một nút từ việc sử dụng ngữ cảnh hiện tại, ví dụ: trong số các con của nút hiện tại, bạn nên sử dụng bộ chọn ngữ cảnh ".//"

+0

Điều đó "." ở phía trước là chìa khóa. Có vẻ lạ với tôi rằng bạn có thể chỉ định một ngữ cảnh, nhưng vẫn là đường dẫn có liên quan đến gốc. Nhún vai. – dbreaux

+1

@dbreaux nó giống như trong vỏ linux, '/ bin/bash' trỏ đến thư mục gốc bất kể bạn ở đâu, nếu bạn có một thư mục khác gọi là bin trong thư mục hiện tại của bạn, bạn phải làm'./Bin/bash' hoặc 'bin/bash' – Morad

6

Nếu bạn bắt đầu biểu thức XPath bằng "/" thì bạn bắt đầu từ nút gốc/nút tài liệu của nút ngữ cảnh. Vì vậy, thay vì "//div[@class = 'title']" hãy sử dụng "descendant::div[@class = 'title']", theo cách đó bạn đang chọn các phần tử div con cháu của nút ngữ cảnh.

+0

Cả hai phương pháp đều hoạt động như một sự quyến rũ. Cảm ơn các bạn rất nhiều !!! – manova

+3

BTW 'hậu duệ :: div [@class = 'title']' tương đương với './/div[@class = 'title']'. – Tomalak

0

Bạn cũng có thể sử dụng location path selectordescendant-or-self. Giống như vậy: descendant-or-self::div... để tham chiếu bắt đầu nút được truyền dưới dạng ngữ cảnh.

Tôi hy vọng tôi đã giúp.

Các vấn đề liên quan