2009-08-04 12 views
3

単純なテーブルを解析してRubyデータ構造にしたいと思っています。テーブルには、次のようになります。Rubyでテーブルを解析する最良の方法

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

編集:Here is the HTML

と私はハッシュの配列の中にそれを解析したいと思います。たとえば、

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

これを行う方法についてのご意見はありますか? PerlにはHTML::TableExtractがありますが、私はその仕事をするだろうと思っていますが、Rubyのための類似のライブラリは見つかりません。

+0

おそらく解析したい実際のHTMLを投稿しますか? –

+0

画像とHTMLのリンクが死んでしまったので、問題が明確ではありません。 –

+0

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

答えて

5

あなたは(gem install hpricot、* nixシステムのための通常のsudoを付加)Hpricotをしようとする

を好むかもしれない、私はこれを実行し、その後、input.htmlにあなたのHTMLを配置しましただから、すでに私たちはダウンTDタグの内容にしている私に

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

を与えます。もう少し仕事があり、そこにはあなたがいます。

が(ちなみに、HTMLを少し不正な形式になります。あなたは<tbody><th>タグを持って、少しあまのじゃく思われる:ちょうど<table>内の別のレベルになるだろう場合<tbody>はかなり無意味です、あなたの<tr><th>...</th></tr>場合、それははるかに理にかなっていますものは別の<thead>セクションwithin the tableにありますが、それはもちろんあなたのHTMLではないかもしれません!)

2

場合はルビーのために、ここであなたはこの自分を書き始めるためにいくつかのコードだと行うためのライブラリがありません。

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" 

をこのコードは明らかに、はるかに完璧からですが、それはあなたを取得する必要がありますが、開始しました。

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 

最初の行のこれ、:

関連する問題