2009年10月27日火曜日

elispでhtmlのtableをparse

 Meadowにhtmlからデータを取りこみたいと思ってhtml-parserがないか、と探し回ってみたけれど、見つけることができず。xml-parserはあるのだけれど、htmlを喰わせるとエラーになる。自分でプログラミングするしかないか、とあきらめてつらつらと考えてふと思いつく。タグを()に置換してやれば、elispのreadで取りこめるのでは?
 どうせ、取りこみたいのはtableのデータだし。
 で、つくってみた。あっさりできたのでびっくり。うーん。やはりLispのかっこは凄いな。汎用性はないだろうけど(tableのタグは他にもあったような気がする)、ぜんぜんぼくには充分。
(defun read-html-table()
"カレントバッファをhtmlのtableのみだと仮定してlistとして取り込む"
(let ((proclist '((lambda()(replace-string "(" "\"("))
(lambda()(replace-string ")" ")\""))
(lambda()(replace-string "[" "\"["))
(lambda()(replace-string "]" "]\""))
(lambda()(replace-string "#" ""))
(lambda()(replace-string ";" ""))
(lambda()(replace-regexp "<table[^>]*>" "("))
(lambda()(replace-regexp "</table>" ")"))
(lambda()(replace-regexp "<tr[^>]*>" "("))
(lambda()(replace-regexp "</tr>" ")"))
(lambda()(replace-regexp "<td[^>]*>" "("))
(lambda()(replace-regexp "</td>" ")"))
(lambda()(replace-regexp "<[^>]*>" " ")))))
(mapcar (lambda(x) (goto-char (point-min)) (funcall x)) proclist)
(goto-char (point-min))
(read (current-buffer))))

でも遅い。しかたないか。