2011-10-27 27 views
10

Tôi đã gặp phải vấn đề về cách tìm trẻ em cấp một từ yếu tố hiện tại? Ví dụ tôi có html:tìm thấy trẻ em cấp 1 trong đường ray nokogiri

<table> 
    <tr>abc</tr> 
    <tr>def</tr> 
    <table> 
    <tr>second</tr> 
    </table> 
</table> 

Tôi đang sử dụng Nokogiri cho đường ray:

table = page.css('table') 
table.css('tr') 

Nó trả về tất cả tr bên table. Nhưng tôi chỉ cần 2 cấp độ đầu tiên cho bảng.

Trả lời

19

Khi bạn nói điều này:

table = page.css('table') 

bạn grabbing cả hai bảng chứ không phải chỉ là bảng cấp cao nhất. Vì vậy, bạn có thể quay trở lại vào thư mục gốc tài liệu và sử dụng một selector mà chỉ phù hợp với các hàng trong bảng đầu tiên như mosch nói hoặc bạn có thể sửa chữa table được chỉ bảng bên ngoài với một cái gì đó như thế này:

table = page.css('table').first 
trs = table.xpath('./tr') 

hoặc ngay cả điều này (tùy thuộc vào cấu trúc thực sự của HTML):

table = page.xpath('/html/body/table') 
trs = table.xpath('./tr') 

hoặc có lẽ một trong những cho table (nhờ Phrogz, một lần nữa):

table = page.at('table') 
table = page.at_css('table') 
# or various other CSS and XPath incantations 
+2

Bạn có thể muốn đề cập đến 'page.at ('table')' hoặc 'page.at_css ('table')' thay vì ' page.css ('table'). first'. – Phrogz

+0

@Phrogz: Cảm ơn, tôi đã ném những người trong hỗn hợp. –

+0

Rủi ro lấy nó quá xa: page.xpath ('// table [not (tổ tiên :: * [1] [name() = "table"])]') – pguardiario

5

Bạn có thể làm

rows = page.css('body > table > tr') 

Có lẽ bạn phải thích ứng với bộ chọn để yếu tố container của bạn (tôi đã chọn 'body' ở đây)

+0

Không, bởi vì nó ca này bạn cũng đã chọn phần tử tr lồng trong bảng bên trong – WarHog

+0

Thật vậy, cảm ơn! Đã chỉnh sửa câu trả lời. – moritz

+1

Bạn cũng có thể làm 'table.css ('> tr')' để có được con cháu trực tiếp của bảng –

1

Như được nêu ra một cách khác, bạn có thể thử sử dụng một cái gì đó như thế này :

text = <<HERE 
    <table> 
    <tr>abc</tr> 
    <tr>def</tr> 
    <table> 
     <tr>second</tr> 
    </table> 
    </table> 
HERE 
xml = Nokogiri::XML(text) 
xml.xpath("/table/tr/").each do |node| 
    puts node.text 
end 

trong ví dụ này, '/ bảng/tr' biểu đại diện cho một đường dẫn tuyệt đối đến các yếu tố cần thiết - 'tr' trong trường hợp của chúng tôi.

+0

vì đây là html, bạn thực sự muốn sử dụng Nokogiri :: HTML. Ngoài ra dấu gạch chéo sau trong xpath của bạn phá vỡ nó. – pguardiario

+0

Rất tiếc, đây là một vài lỗi chính tả của tôi - bạn hoàn toàn đúng, lời xin lỗi của tôi :) – WarHog

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