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人5回まで
  • 登録:
  • 終了:2012/09/15 10:25:56
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。
id:yato12

環境は

環境はWin7 

ruby 1.9.3p194

gems 1.9.1

mechanize 2.5.1

です。

ベストアンサー

id:Cherenkov No.1

回答回数1504ベストアンサー獲得回数493

ポイント200pt
<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のよくある質問 - きたももんががきたん。

他1件のコメントを見る
id:Cherenkov

①と②を追記しました。

2012/09/14 07:16:10
id:Cherenkov

page.search("/html/body/div[3]/div/table/tr")のようにxpathで尚且絶対パスで指定するのはサイト構造変化に弱く、また記述も面倒なので相対的なものにするようおすすめします。xpathで②を解くとしたら

values = page.search('//tr[@class="list"]/td[2]/a').map{|e| e.text}
puts values

とか。
回答1はcssセレクタによるものです。

2012/09/14 07:24:00

その他の回答0件)

id:Cherenkov No.1

回答回数1504ベストアンサー獲得回数493ここでベストアンサー

ポイント200pt
<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のよくある質問 - きたももんががきたん。

他1件のコメントを見る
id:Cherenkov

①と②を追記しました。

2012/09/14 07:16:10
id:Cherenkov

page.search("/html/body/div[3]/div/table/tr")のようにxpathで尚且絶対パスで指定するのはサイト構造変化に弱く、また記述も面倒なので相対的なものにするようおすすめします。xpathで②を解くとしたら

values = page.search('//tr[@class="list"]/td[2]/a').map{|e| e.text}
puts values

とか。
回答1はcssセレクタによるものです。

2012/09/14 07:24:00

コメントはまだありません

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

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

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

回答リクエストを送信したユーザーはいません