2016-04-30 2 views
-2

Ich habe Schwierigkeiten herauszufinden, wie man das folgende Array aufspaltet und es in ein Format umwandelt, damit ich ein Active Record Array von Hashes erstellen kann.Wie man ein Array von Strings teilt und in ein Array von Hashes umwandelt

Mein Problem stammt aus dem Schreiben einer Anwendung, die auf Nokogiri beruht, um Informationen aus dem Internet zu kratzen. Die Daten in jeder Zeile einer Tabelle, die ich extrahieren möchte, sind in ein einziges Element geblockt. Jede Zeile hat nur ein <td> Element.

EDIT: Die erste Webseite eine <ul> Liste von ein paar hundert Elemente enthält und einen Link auf die Detailseite. Ich durchlaufe jedes Element und benutze den Link, um auf die Detailseite zum Parsen zuzugreifen. Das Tabellenelement, das ich unten analysiere, stammt von der Detailseite. Wenn Sie auf die Ausgabe von schauen, gebe ich die vollständigen Daten der ersten Zeile (Ebene 1), dann einen Teil der zweiten Zeile (Ebene 2), um zu zeigen, dass es in der Struktur identisch ist, aber nicht im Wert. Das Lösen des Problems für die erste Zeile löst das Problem für alle 6 Zeilen.

<td> 
    Level 1 
    <br> 
    Attribute A: 24% 
    <br> 
    Attribute B: 14% 
    <br> 
    Attribute C: 15.5% 
</td> 

Ich schaffte es, die Daten im folgenden Format als Array von Arrays zu erhalten. Ich tat dies, indem er mit dem folgenden Code den langen String-Splitting:

row.xpath('tr').each_with_index do |td, j| 
    split_array << td.text.squish.split('%') 
end 

Hier ist die Teilleistung von split_array:

[["Level: 1 Attribute A: 24", "Attribute B: 14", "Attribute C: 15.5"],["Level: 2 Atribute A: 36", ..etc]..etc] 

Ich muss:

  1. loszuwerden der Level: 1 , Level: 2 ... aus dem ersten Element in jedem Array
  2. teilen Sie die Attribute Name und th e Float-Werte in ihrem eigenen Bereich
  3. konvertieren diese Teile in ein Array von Hashes, die auf dieser recht ähnlich sieht:

    [{:statistic => "Attribute A", :level_1 => 24.0, :level_2 =>36},{:statistic => "Attribute B", :level_1 => 14.0,:level_2 => 24},{:statistic => "Attribute C", :level_1 => 15.5, :level_2 => 34}] 
    

Ich bin für Code, Pseudo-Code zu fragen, oder Ideen, die schicken Ich bin in die richtige Richtung, um mein Array von Arrays in das Array von Hashes umzuwandeln, das ich oben skizziert habe.

+0

Bitte lesen Sie "[mcve]". Ich sehe kein "Level: 2" von Ihrem Beispiel-HTML. Bitte stellen Sie sicher, dass Ihre Eingabedaten mit Ihrem Code und Ihrer Beschreibung übereinstimmen. Wir können nicht etwas loswerden, das nicht da ist. –

+0

Wenn Sie einen Bildlauf durchführen, habe ich nur einen Teil der Ebene 2 gezeigt, nur um zu zeigen, dass die Struktur identisch, aber nicht der Wert ist. Ich habe meine Frage bearbeitet, um sie näher zu erläutern. – ctilley79

Antwort

0

1) Anstatt in einer <td> Zeichenfolge mit verschiedenen Arten von Informationen zu schlucken und sie dann zu analysieren, empfehle ich, sie in sinnvollen Variablen zu speichern, um damit zu beginnen. Speichern Sie beispielsweise die Ebene in einer Variablen und das Array von Attributsstatistiken in einer anderen, indem Sie sie mithilfe der von Nokogiri bereitgestellten Analysefunktionen abrufen.

2) In Bezug auf diese Strings:

"Attribute B: 14" 

Hier ist ein Skript enthält, und ein Verfahren darstellt, die sie analysieren wird:

#!/usr/bin/env ruby 

def parse_attr_string(s) 
    a = s.split 
    name = a[1].gsub(':', '') 
    value = a[2].gsub('%', '').to_f 
    [name, value] 
end 

s = "Attribute B: 14" 

name, value = parse_attr_string(s) 

puts "Name: #{name}, Value: #{value}" # Name: B, Value: 14.0 

3) In Bezug auf die Reorganisation der Daten, wie zu versuchen, um es herauszufinden und es in Pseudocode auszudrücken und dann zu veröffentlichen, was du hast, wenn du irgendwelche Probleme damit hast?

+0

Vielen Dank für Ihre Antwort !! Ich werde sehen, wohin ich damit komme, und wenn ich weitere Fragen habe, werde ich hier zurück posten – ctilley79