Sto cercando di riempire le variabili parent_element_h1
e parent_element_h2
. Qualcuno può aiutarmi a usare Nokogiri per ottenere le informazioni di cui ho bisogno in queste variabili?Come navigare nel 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 =
Si prega di notare: L'elemento start_here
potrebbe essere ovunque all'interno del documento. I dati HTML sono solo un esempio. Detto questo, le intestazioni <h1>
e <h2>
potrebbero essere un fratello di start_here
o un figlio di un fratello di start_here
.
Il seguente metodo ricorsivo è un buon punto di partenza, ma non funziona su <h1>
perché è un figlio di un fratello di 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')
Dopo aver accettato una risposta, mi è venuta con my own solution. Funziona come un fascino e penso che sia abbastanza bello.
Il problema è che non so se l'intestazione è un fratello o un figlio di un fratello. La tua soluzione presuppone che io sappia se si tratta di un fratello o un figlio di un fratello. Inoltre, i miei dati di esempio sono molto più brevi dei miei dati reali: "my_tag" può essere ovunque all'interno del documento. – Javier
puoi usare '//' invece di '/ html/body /' o anche '/ html/body // div' in XPath quando non sei sicuro della relazione tra fratello e figlio. http://www.w3schools.com/Xpath/ –
Penso che la mia domanda non fosse abbastanza specifica, ho modificato la domanda e spero che sia ora chiaro quello che sto cercando (controlla i commenti sopra le variabili che sono cercando di riempire di dati). – Javier