[ruby-list:45890] how to extract nested table

From: Hiroki Kashiwazaki <reo@...>
Date: 2009-02-25 16:20:52 UTC
List: ruby-list #45890
柏崎@北海道です.

# rubyそのものの質問でなくて恐縮です.
# しかも説明がへたくそで大変恐縮です.

HTML の table 要素を読んで,中の td 要素内にあるデータを吸い出そうと
考えています.一行分のデータを,各列の見出し名をキーとしたハッシュに
格納して,このハッシュを配列に格納して全てのデータを取り出そうとして
います.

一応図解.
  | "a" | "b" | "c" |
--+-----+-----+-----+
1 | "a1"| "b1"| "c1"|
2 | "a2"| "b2"| "c2"|
3 | "a3"| "b3"| "c3"|
--+-----+-----+-----+
で

[{"a" => "a1", "b" => "b1", "c" => "c1"}, 
 {"a" => "a2", "b" => "b2", "c" => "c2"}, 
 {"a" => "a3", "b" => "b3", "c" => "c3"} ]

のようなデータを引っ張って来たいと.

表の構造に柔軟に対応できるように,見出しの配列 (ここでは
["a", "b", "c"])をメソッドに渡すことで,一行の要素数と各項目の見出し
が変化しても追従できるようにしました.が,table が入れ子になっている
ような構造の場合はこの方法ではうまくいきません.

図解.

  |         |         |        "c"         |
  |   "a"   |   "b"   | "ca" | "cb" | "cc" |
--+---------+---------+------+------+------+
  |         |         |"ca11"|"cb11"|"cc11"|
1 |   "a1"  |   "b1"  |"ca12"|"cb12"|"cc12"|
  |         |         |"ca13"|"cb13"|"cc13"|
--+---------+---------+------+------+------+
  :         :         :      :      :      :

で

[{"a" => "a1", "b" => "b1", 
  "c" => [{"ca" => "ca11", "cb" => "cb11", "cc" => "cc11"}, 
          {"ca" => "ca12", "cb" => "cb12", "cc" => "cc12"}, 
	  {"ca" => "ca13", "cb" => "cb13", "cc" => "cc13"}]}, 
 {"a" => "a2", "b" => "b2", .....

のようなデータを引っ張ってくるためにメソッドに構造を知らせるために
配列を使うと ["a", "b", ["ca", "cb", "cc"]] となり, "c" のような枝
部分の見出しを知らせることが出来ません.一方でハッシュを使って構造を
知らせようとすると,
{"a" => nil, "b" => nil, "c" => {"ca" => nil, "cb" => nil, "cc" => nil}}
といった感じになりましょうが,ハッシュなので順序が確保できません.

一応思いつく解決策としては

(1) 構造をメソッドに知らせる方法として配列を使い,入れ子になってい
    る部分の "c" という見出しを使わず,入れ子部分の見出し名を join
    した名前 ("ca-cb-cc" とか) を使う.

(2) ハッシュの順番を保持するために 1.9 を使う :-)

あたりを考えているのですが,より美しい解決策はないかと考えております.
あるいはそもそも根本的に考え方が間違ってるのかとも思うのですが…….
アドバイスなどいただければ幸いです.

-- 
柏崎 礼生 (Hiroki Kashiwazaki)@HUIST
Assistant Professor @ Graduate School of Information Science and
Technology, Hokkaido University
mailto:reo@iic.hokudai.ac.jp
Tel:+81-11-706-2056 (Office), +81-11-706-2998 (Takai Lab.)

In This Thread

Prev Next