人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Ruby言語、HTML抽出での質問です。解決できなく困ってます。

下記テーブルからデータ抽出したいのですが、解決できないのでお願いします。
したいことが。2点あります。

【HTMLの内容】
<table>
<tr class="list">
<td>リンク1 タイトルA</td>
<td>リンク2 値A</td>
</tr>
<tr class="list">
<td>リンク3 タイトルB</td>
<td>リンク4 値B</td>
</tr>
<tr class="list">
<td>リンク5 タイトルC</td>
<td>リンク6 値C</td>
</tr>
</table>

リンク7
リンク8
リンク9
リンク10

------------------
? 上記HTMLより、trタグclass="list"のリンクのみ配列データで取得したい
リンク1
リンク2
リンク3
リンク4
リンク5
リンク6

?
値A、B、C を配列データで取得したい

------------------
mechanize をつかってリンクは下記でできますが、その先がわかりません。。。。

require 'mechanize'
agent = Mechanize.new

url_ary = Array.new
site_top_url = "http://www.xxxx.com/"
page = agent.get(site_top_url)

page.search("/html/body/div[3]/div/table/tr")
page.links.each do |link|

puts link

end


以上宜しくお願いします。

●質問者: とし
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

質問者から

環境は
環境はWin7
ruby 1.9.3p194
gems 1.9.1
mechanize 2.5.1
です。


1 ● Cherenkov
●200ポイント ベストアンサー
<html>
<body>
<table>
 <tr class="list">
 <td><a href="1">リンク1 タイトルA</a></td>
 <td><a href="2">リンク2 値A</a></td>
 </tr>
 <tr class="list">
 <td><a href="3">リンク3 タイトルB</td>
 <td><a href="4">リンク4 値B</a></td>
 </tr> 
 <tr class="list">
 <td><a href="5">リンク5 タイトルC</a></td>
 <td><a href="6">リンク6 値C</a></td>
 </tr>
</table>
<a href="7">リンク7</a>
<a href="8">リンク8</a>
<a href="9">リンク9</a>
<a href="10">リンク10</a>
</body>
</html>

require 'mechanize'
agent = Mechanize.new
site_top_url = "http?"
page = agent.get(site_top_url)

#?
#htmlを取得
links = page.search('.list td a').map{|e| e.to_html}
#「リンク1 タイトルA」のテキストを取得
#links = page.search('.list td a').map{|e| e.inner_text}
#hrefだけ
#links = page.search('.list td a').map{|e| e['href']}
p links

#?
#質問と同じDOM構造なら以下のcssセレクタで
values = page.search('.list td:last-child a').map{|e| e.text}
#xpathなら
values = page.search('//tr[@class="list"]/td[2]/a').map{|e| e.text}
puts values

参考:RubyのMechanizeのよくある質問 - きたももんががきたん。


Cherenkovさんのコメント
質問ちゃんと読んでなかった。ちょっとお待ちを。

Cherenkovさんのコメント
?と?を追記しました。

Cherenkovさんのコメント
page.search("/html/body/div[3]/div/table/tr")のようにxpathで尚且絶対パスで指定するのはサイト構造変化に弱く、また記述も面倒なので相対的なものにするようおすすめします。xpathで?を解くとしたら >|ruby| values = page.search('//tr[@class="list"]/td[2]/a').map{|e| e.text} puts values ||< とか。 回答1はcssセレクタによるものです。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ