Tôi đang cố gắng điền các biến parent_element_h1
và parent_element_h2
. Bất cứ ai có thể giúp tôi sử dụng Nokogiri để nhận thông tin tôi cần vào các biến đó không?Cách điều hướng DOM bằng Nokogiri
require 'rubygems'
require 'nokogiri'
value = Nokogiri::HTML.parse(<<-HTML_END)
"<html>
<body>
<p id='para-1'>A</p>
<div class='block' id='X1'>
<h1>Foo</h1>
<p id='para-2'>B</p>
</div>
<p id='para-3'>C</p>
<h2>Bar</h2>
<p id='para-4'>D</p>
<p id='para-5'>E</p>
<div class='block' id='X2'>
<p id='para-6'>F</p>
</div>
</body>
</html>"
HTML_END
parent = value.css('body').first
# start_here is given: A Nokogiri::XML::Element of the <div> with the id 'X2
start_here = parent.at('div.block#X2')
# this should be a Nokogiri::XML::Element of the nearest, previous h1.
# in this example it's the one with the value 'Foo'
parent_element_h1 =
# this should be a Nokogiri::XML::Element of the nearest, previous h2.
# in this example it's the one with the value 'Bar'
parent_element_h2 =
Xin lưu ý: Yếu tố start_here
có thể là bất cứ nơi nào trong tài liệu. Dữ liệu HTML chỉ là một ví dụ. Điều đó nói rằng, các tiêu đề <h1>
và <h2>
có thể là anh chị em của start_here
hoặc con của anh chị em của start_here
.
Phương pháp đệ quy sau đây là một điểm khởi đầu tốt, nhưng nó không hoạt động trên <h1>
bởi vì nó là một đứa con của anh chị em ruột của start_here
:
def search_element(_block,_style)
unless _block.nil?
if _block.name == _style
return _block
else
search_element(_block.previous,_style)
end
else
return false
end
end
parent_element_h1 = search_element(start_here,'h1')
parent_element_h2 = search_element(start_here,'h2')
Sau khi chấp nhận một câu trả lời, tôi đã đưa ra với my own solution. Nó hoạt động như một nét duyên dáng và tôi nghĩ nó khá tuyệt.
Vấn đề là, tôi không biết liệu đầu trang là anh chị em hay con của anh chị em ruột. Giải pháp của bạn giả định rằng tôi biết nếu đó là anh chị em hoặc con của anh chị em ruột. Bên cạnh đó, dữ liệu ví dụ của tôi ngắn hơn nhiều so với dữ liệu thực của tôi: 'my_tag' có thể ở bất kỳ đâu bên trong tài liệu. – Javier
bạn có thể sử dụng '//' thay vì '/ html/body /' hoặc thậm chí '/ html/body // div' trong XPath khi bạn không chắc chắn về mối quan hệ anh/em. http://www.w3schools.com/Xpath/ –
Tôi nghĩ câu hỏi của mình không đủ cụ thể, tôi đã chỉnh sửa câu hỏi và hy vọng câu hỏi này hiện rõ ràng những gì tôi đang tìm kiếm (kiểm tra các nhận xét ở trên các biến tôi đang cố gắng điền dữ liệu). – Javier