2009-08-04 20 views
3

Ich möchte eine einfache Tabelle in eine Ruby-Datenstruktur analysieren. Die Tabelle sieht wie folgt aus:Die beste Methode zum Analysieren einer Tabelle in Ruby

alt text http://img232.imageshack.us/img232/446/picture5cls.pnghttp://img232.imageshack.us/img232/446/picture5cls.png

Edit:Here is the HTML

und ich möchte es in ein Array von Hashes analysieren. ZB:

schedule[0]['NEW HAVEN'] == '4:12AM' 
schedule[0]['Travel Time In Minutes'] == '95' 

Irgendwelche Gedanken darüber, wie man das macht? Perl hat HTML::TableExtract, was meiner Meinung nach den Job erledigen würde, aber ich kann keine ähnliche Bibliothek für Ruby finden.

+0

Vielleicht post die eigentliche HTML, die Sie analysieren möchten? –

+0

Die Bild- und HTML-Links sind jetzt tot, was die Frage weniger deutlich macht. –

+0

http://stackoverflow.com/questions/2062051/how-do-i-parse-an-html-table-with-nokogiri – peter

Antwort

5

Sie könnten Hpricot ausprobieren (gem install hpricot, prepend die übliche sudo für * nix-Systeme)

ich Ihre HTML-Code in input.html gelegt, lief dann das:

require 'hpricot' 

doc = Hpricot.XML(open('input.html')) 

table = doc/:table 

(table/:tr).each do |row| 
    (row/:td).each do |cell| 
    puts cell.inner_html 
    end 
end 

die, für die erste Reihe , gibt mir

<span class="black">12:17AM </span> 
<span class="black"> 
    <a href="http://www.mta.info/mnr/html/planning/schedules/ref.htm"></a></span> 
<span class="black">1:22AM </span> 
<span class="black"> 
    <a href="http://www.mta.info/mnr/html/planning/schedules/ref.htm"></a></span> 
<span class="black">65</span> 
<span class="black">TRANSFER AT STAMFORD (AR 1:01AM & LV 1:05AM)                   </span> 
<span class="black"> 

N 


</span> 

So schon sind wir auf den Inhalt der TD Tags nach unten. Ein bisschen mehr Arbeit und du bist da.

(BTW, sieht das HTML ein wenig fehlerhaft: Sie <th> Tags in <tbody>, haben die ein bisschen pervers scheint. <tbody> ist ziemlich sinnlos, wenn es geht nur innerhalb <table> eine andere Ebene sei es viel mehr Sinn, wenn Ihr <tr><th>...</th></tr> macht Zeug ist in einem separaten <thead> Abschnitt within the table. Aber es kann nicht "Ihr" HTML natürlich sein!)

2

Falls es keine Bibliothek ist, dass für Ruby zu tun, hier ist einige Code du diese Texte selbst schreiben zu erhalten begonnen:

require 'nokogiri' 
doc=Nokogiri("<table><tr><th>la</th><th><b>lu</b></th></tr><tr><td>lala</td><td>lulu</td></tr><tr><td><b>lila</b></td><td>lolu</td></tr></table>") 
header, *rest = (doc/"tr").map do |row| 
    row.children.map do |c| 
    c.text 
    end 
end 
header.map! do |str| str.to_sym end 
item_struct = Struct.new(*header) 
table = rest.map do |row| 
    item_struct.new(*row) 
end 
table[1].lu #=> "lolu" 

Dieser Code bei weitem nicht perfekt ist, natürlich, aber es sollten Sie gestartet.

Verwandte Themen