Estoy tratando de completar las variables parent_element_h1
y parent_element_h2
. ¿Alguien puede ayudarme a usar Nokogiri para obtener la información que necesito sobre esas variables?Cómo navegar el DOM usando 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 =
Tenga en cuenta: El elemento start_here
podría estar en cualquier lugar dentro del documento. Los datos HTML son solo un ejemplo. Dicho esto, los encabezados <h1>
y <h2>
podrían ser un hermano de start_here
o un hijo de un hermano de start_here
.
El siguiente método recursivo es un buen punto de partida, pero no funciona en <h1>
porque es un hijo de un hermano de 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')
Después de aceptar una respuesta, se me ocurrió con my own solution. Funciona a las mil maravillas y creo que es genial.
El problema es que no sé si el encabezado es un hermano o un hijo de un hermano. Su solución asume que sé si es un hermano o un hijo de un hermano. Además de eso, mis datos de ejemplo son mucho más cortos que mis datos reales: 'my_tag' puede estar en cualquier lugar dentro del documento. – Javier
puede usar '//' en lugar de '/ html/body /' o incluso '/ html/body // div' en XPath cuando no esté seguro de la relación hermano/hijo. http://www.w3schools.com/Xpath/ –
Creo que mi pregunta no fue lo suficientemente específica, edité la pregunta y espero que ahora esté claro lo que estoy buscando (revisen los comentarios sobre las variables que estoy tratando de llenar con datos). – Javier