ruby hpricot で下記をパースして、北海道,http://xxxx.hokkaido.xxxx/ というようなCSV(でなくてもいいですが)をつくりたいのです。どうパースの部分を書くのでしょうか? テーブルで、名前、リンクの順にならんでいる事例なのでぴったりのがないとは思いますが、もしあったらのURLもお願いします。


<table >
<tr>
<td >
北海道</td>
<td >
<A href="http://xxxx.hokkaido.xxxx/" >
●</A></td>
</tr>
</table>

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2008/04/29 08:19:47
  • 終了:2008/04/29 09:50:49

ベストアンサー

id:moro No.1

moro回答回数23ベストアンサー獲得回数102008/04/29 08:37:26

ポイント100pt

http://code.whytheluckystiff.net/hpricot/

URLは公式サイトです。速度的な問題があればパース部分には最適化の余地はありますけど、とりあえずこんな感じでどうでしょう。

配列の配列でとるので、あとはお好きなように出力してください。

#!/usr/bin/env ruby
# vim:set fileencoding=utf-8 filetype=ruby
$KCODE = 'u'

require 'rubygems'
require 'hpricot'

html = <<HTML
<table>
<tr>
<td >
北海道</td>
<td >
<A href="http://xxxx.hokkaido.xxxx/" >
●</A></td>
</tr>
</table>
HTML

doc = Hpricot.parse(html)
arr = doc.search('table tr').map do |tr|
  td_name, td_link, = tr.search('td')

  [ td_name.inner_html.strip,
    link = td_link.search('a').attr("href").strip ]
end

p arr
id:isogaya

ありがとうございます。

link = td_link.search('a').attr("href").strip  の部分なんですけど、リンクがなく空白のセルだとエラーでとまります。回避するにはどうするといいのでしょうか?

2008/04/29 09:07:11
  • id:moro
    ブロックの中身をこんな感じにしてみてはいかがでしょう。場当たり的ですが。。。

    >|ruby|
    td_name, td_link, = tr.search('td')
    link_tag = td_link.search('a')
    link = link_tag.empty? ? '' : link_tag.attr('href').strip
    [ td_name.inner_html.strip, link ]
    ||<

  • id:isogaya
    ばっちりです。ありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません