2016-12-09 1 views
0

Ich habe eine Grundstruktur der Seite mit den Elementen (Span) unter anderen Elementen verschachtelt (divs und Span). Hier ein Beispiel:Nokogiri HTML Verschachtelte Elemente Klasse extrahieren und Text

html = "<html> 
    <body> 
    <div class="item"> 
     <div class="profile"> 
     <span class="itemize"> 
     <div class="r12321">Plains</div> 
      <div class="as124223">Trains</div> 
      <div class="qwss12311232">Automobiles</div> 
     </div> 
     <div class="profile"> 
     <span class="itemize"> 
      <div class="lknoijojkljl98799999">Love</div> 
      <div class="vssdfsd0809809">First</div> 
      <div class="awefsaf98098">Sight</div> 
     </div> 
    </div> 
    </body> 
</html>" 

Beachten Sie, dass die Klassennamen zufällig sind. Beachten Sie auch, dass Whitespace und Tabs im HTML vorhanden sind.

Ich möchte die Kinder extrahieren und wie so mit einem Hash am Ende:

page = Nokogiri::HTML(html) 
itemhash = Hash.new 
page.css('div.item div.profile span').map do |divs| 
    children = divs.children 
    children.each do |child| 
    itemhash[child['class']] = child.text 
    end 
end 

Ergebnis sollte ähnlich sein:

{\"r12321\"=>\"Plains\", \"as124223\"=>\"Trains\", \"qwss12311232\"=>\"Automobiles\", \"lknoijojkljl98799999\"=>\"Love\", \"vssdfsd0809809\"=>\"First\", \"awefsaf98098\"=>\"Sight\"} 

Aber ich bin endet mit einem versauen wie dieses:

{nil=>\"\\n\\t\\t\\t\\t\\t\\t\", \"r12321\"=>\"Plains\", nil=>\" \", \"as124223\"=>\"Trains\", \"qwss12311232\"=>\"Automobiles\", nil=>\"\\n\\t\\t\\t\\t\\t\\t\", \"lknoijojkljl98799999\"=>\"Love\", nil=>\" \", \"vssdfsd0809809\"=>\"First\", \"awefsaf98098\"=>\"Sight\"} 

Dies ist wegen der Tabs und Leerzeichen in der HTML. Ich habe keine Kontrolle darüber, wie der HTML-Code generiert wird. Daher versuche ich, das Problem zu umgehen. Ich habe Noblanks versucht, aber das funktioniert nicht. Ich habe auch gsub versucht, aber das zerstört nur mein Markup.

Wie kann ich die Klasse und die Werte dieser verschachtelten Elemente extrahieren, während Leerräume und Tabs sauber ignoriert werden?

P.S. Ich bin nicht auf Nokogiri aufgehängt - also wenn ein anderes Juwel es besser machen kann, bin ich ein Spiel.

Antwort

1

Die children Methode gibt alle untergeordneten Knoten, einschließlich Textknoten-auch wenn sie leer sind.

Um nur untergeordnete Elemente erhalten Sie eine explizite XPath-Abfrage tun könnte (oder möglicherweise die entsprechende CSS), zB:

children = divs.xpath('./div') 

Sie auch die children_elements method verwenden könnte, die näher sein würde, was Sie bereits tun und die nur gibt Kinder, die Elemente sind:

children = divs.element_children