2010-01-17 28 views
21

Tôi chưa tìm thấy bất kỳ tài liệu hay hướng dẫn nào cho điều đó. Có bất cứ điều gì như thế tồn tại?Làm cách nào để sử dụng XPath trong Nokogiri?


doc.xpath('//table/tbody[@id="threadbits_forum_251"]/tr') 

Đoạn mã trên sẽ làm cho tôi bất kỳ table, bất cứ nơi nào, có một đứa trẻ tbody với thuộc tính id bằng "threadbits_forum_251". Nhưng tại sao nó bắt đầu với đôi //? Tại sao có /tr ở cuối? Xem "Ruby Nokogiri Parsing HTML table II" để biết thêm chi tiết.


Ai có thể cho tôi biết làm thế nào để giải nén href, id, alt, src, vv sử dụng Nokogiri?

td[3]/div[1]/a/text()' <--- extracts text 

Tôi có thể trích xuất những thứ khác bằng cách nào?

Trả lời

41

Có vẻ bạn cần phải đọc một

biểu XPath Tutorial bạn //table/tbody[@id="threadbits_forum_251"]/tr có nghĩa là:

  • // - Anywhere trong tài liệu XML của bạn
  • table/tbody - mất một yếu tố bảng với một đứa trẻ tbody
  • [@id="threadbits_forum_251"] - trong đó thuộc tính id id bằng "threadbits_forum_251"
  • tr - và mất tr yếu tố của nó

Vì vậy, về cơ bản, bạn cần phải biết:

  • thuộc tính bắt đầu với @
  • điều kiện đi bên [] ngoặc

Nếu tôi correcly hiểu rằng API, bạn có thể đi với doc.xpath("td[3]/div[1]/a")["href"], hoặc td[3]/div[1]/a/@href i f chỉ có một phần tử <a>.

+0

@Rubens cảm ơn bạn. Và bạn nói đúng Tôi cần đọc Hướng dẫn XPath. Tôi nghĩ rằng đó là tài liệu nokorigi tôi cần đọc ... bạn có biết nếu có bất kỳ công cụ nào có thể cung cấp cho tôi Xpath đầy đủ nếu tôi nhấp và đối tượng trên trang html không? – Radek

+8

Tôi không biết, nhưng XPath không phải là khó; xem xét hệ thống tập tin của bạn, và cho phép giả sử mỗi thư mục là một phần tử XML; vì vậy, khi bạn chọn thư mục 'system32', bạn sẽ nhận được đường dẫn' \ windows \ system32'; chỉ thay thế '\\' 'bằng'/', xem xét các thuộc tính bắt đầu bằng' @ 'và điều kiện bằng' [] 'và bạn tốt để đi –

+2

Tôi biết đây là câu trả lời cũ hơn nhưng liên kết đến hướng dẫn xpath là bây giờ bị hỏng. Tôi nghĩ rằng bây giờ nó sẽ là http://www.w3schools.com/xsl/xpath_intro.asp – Axiombadger

6

XPath của bạn là chính xác và bạn dường như đã trả lời phần đầu câu hỏi của riêng của bạn (hầu như):

doc.xpath('//table/tbody[@id="threadbits_forum_251"]/tr') 

"các mã trên sẽ làm cho tôi bất kỳ bảng tr của bảng, bất cứ nơi nào, có một đứa trẻ tbody với thuộc tính id bằng threadbits_forum_251"


// nghĩa các yếu tố sau đây có thể xuất hiện bất cứ nơi nào trong tài liệu.

/tr ở cuối phương tiện, nhận nút tr của phần tử phù hợp.

Bạn không cần trích xuất từng thuộc tính một.Chỉ nhận được toàn bộ nút có chứa tất cả bốn thuộc tính trong Nokogiri, và nhận được các thuộc tính sử dụng:

theNode['href'] 
theNode['src'] 

đâu theNode là đối tượng Nokogiri Node của bạn.


Edit:

Xin lỗi tôi đã không sử dụng các thư viện này, nhưng tôi nghĩ rằng việc đánh giá XPath và phân tích cú pháp đã được thực hiện bằng cách mechanize. Vì vậy, đây là cách bạn sẽ có được toàn bộ phần tử và các thuộc tính của nó trong một lần.

doc.xpath("td[3]/div[1]/a").each do |anchor| 
    puts anchor['href'] 
    puts anchor['src'] 
    ... 
end 
+0

@Anurag cảm ơn vì lời giải thích tốt đẹp. Tôi đang sử dụng cơ giới hóa không thuần túy nokogiri, tôi có thể sử dụng theNode ['href'] bằng cách nào đó trong [: title, 'td [3]/div [1]/a/văn bản()'] ,? Tôi muốn trích xuất href thay vì văn bản – Radek

+1

'[: địa chỉ, 'td [3]/div [1]/a/@ href']'? –

+0

tôi đã tìm kiếm hướng dẫn nokogiri và đi qua câu trả lời của riêng tôi .. hehe :) – Anurag

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