2017-11-26 8 views
-2

ich eine Webseite mit nokogiri wie so Schaben:Ruby-Schalter, zeigen nur die erste und letzte

doc = Nokogiri::HTML(File.read(html))  
doc.each do |node| 
    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 
    end 
end 

Es gibt viele H5. Ich möchte sie nicht alle aufzählen, sondern sie zusammen gruppieren und nur die erste und letzte unter ihrem jeweiligen h4 zeigen.

+0

Was ist der html eine Vorstellung zu bekommen, und was wollen Sie wirklich? –

+0

Sie können mit einem einzigen XPath-Ausdruck wählen, was Sie wollen. –

Antwort

0

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 
+0

hat perfekt funktioniert! danke –

+0

Ich schlage vor 'wenn 'h1', 'h2', 'h3', 'h4'' (gefolgt von' puts node.text'). –

+0

Wie ich in meiner Antwort geschrieben habe: _Dieser Code würde den h5-Text wiederholen, wenn es nur einen geben würde. Aus Ihrer Beschreibung ist dies in Ihren Daten jedoch nicht der Fall. _ - Die Frage hat diesen Randfall explizit nicht. Aber Sie haben Recht. Dies könnte durch eine zusätzliche Überprüfung erfasst werden. (Sie könnten einen Zähler anstelle der booleschen Flagge verwenden). – knut

Verwandte Themen