Sie könnten ein Flag definieren, um festzustellen, ob es der erste h5
Eintrag ist. Wenn es der erste ist, drucken Sie den Text. Und Sie speichern den Text in einer Variablen, um ihn später zu verwenden.
Wenn die Ebene von h5 zurückgesetzt wird, müssen Sie den letzten Knotentext schreiben.
Am Ende müssen Sie den letzten Knotentext schreiben.
Etwas wie folgt aus:
doc = Nokogiri::HTML(File.read(html))
first_flag = true
last_h5 = nil
doc.each do |node|
#there was a h5 and now we have new version
if first_flag == false and node.name != 'h5'
puts last_h5
first_flag = true
end
case node.name
when 'h1'
puts node.text
when 'h2'
puts node.text
when 'h3'
puts node.text
when 'h4'
puts node.text
when 'h5'
puts node.text if first_flag
first_flag = false
last_h5 = node.text
end
end
#Write the last entry
if first_flag == false and last_h5
puts last_h5
end
Dieser Code würde die h5-Text wiederholen, wenn es nur eine sein würde. Nach Ihrer Beschreibung ist dies in Ihren Daten nicht der Fall.
Verzicht: Ungeprüfte Code, der Test html fehlt;)
Wenn die Boolesche Flag mit einem Zähler ersetzt werden, dann kann man auch den Fall der Rand mit einem H5-Knoten fangen.
Beispiel:
h5_count = 0
last_h5 = nil
doc.each do |node|
#there was a h5 and now we have new version
if h5_count > 1 and node.name != 'h5'
puts last_h5
h5_count = 0
end
case node.name
when 'h1'
puts node.text
when 'h2'
puts node.text
when 'h3'
puts node.text
when 'h4'
puts node.text
when 'h5'
puts node.text if h5_count == 0
h5_count += 1
last_h5 = node.text
end
end
#Write the last entry
if h5_count > 1
puts last_h5
end
Was ist der html eine Vorstellung zu bekommen, und was wollen Sie wirklich? –
Sie können mit einem einzigen XPath-Ausdruck wählen, was Sie wollen. –