Was ist der intelligenteste Weg, um Nokogiri den gesamten Inhalt zwischen dem Start- und Stoppelement (einschließlich Start-/Stoppelement) auszuwählen?Nokogiri: Wählen Sie den Inhalt zwischen Element A und B
prüfen Beispielcode unten zu verstehen, was ich suche:
require 'rubygems'
require 'nokogiri'
value = Nokogiri::HTML.parse(<<-HTML_END)
"<html>
<body>
<p id='para-1'>A</p>
<div class='block' id='X1'>
<p class="this">Foo</p>
<p id='para-2'>B</p>
</div>
<p id='para-3'>C</p>
<p class="that">Bar</p>
<p id='para-4'>D</p>
<p id='para-5'>E</p>
<div class='block' id='X2'>
<p id='para-6'>F</p>
</div>
<p id='para-7'>F</p>
<p id='para-8'>G</p>
</body>
</html>"
HTML_END
parent = value.css('body').first
# START element
@start_element = parent.at('p#para-3')
# STOP element
@end_element = parent.at('p#para-7')
Das Ergebnis (Rückgabewert) wie dieses aussehen sollte:
<p id='para-3'>C</p>
<p class="that">Bar</p>
<p id='para-4'>D</p>
<p id='para-5'>E</p>
<div class='block' id='X2'>
<p id='para-6'>F</p>
</div>
<p id='para-7'>F</p>
Update: Das ist mein aktuelle Lösung, obwohl ich denke, es muss etwas klüger sein:
@my_content = ""
@selected_node = true
def collect_content(_start)
if _start == @end_element
@my_content << _start.to_html
@selected_node = false
end
if @selected_node == true
@my_content << _start.to_html
collect_content(_start.next)
end
end
collect_content(@start_element)
puts @my_content
Vielen Dank für Ihre Lösungen und vielen Dank für Ihre über-smart rekursive Einzeiler! Allerdings verstehe ich nicht, was das '*' vor dem rekursiven Aufruf von collect_between() steht. Könnten Sie das näher ausführen? – Javier
Ich habe eine kleine Erklärung in meiner ursprünglichen Antwort hinzugefügt. Google rum für "Splat Operator" für mehr :-) –
Danke! Nur aus Neugier: Haben Sie eine Ahnung, wo der "Splat-Operator" dokumentiert ist? Konnte kein Wort in http://www.ruby-doc.org/core/ – Javier