Ruby Mechanize wiki (ja) - Mechanize::Page::Link

Mechanize::Page::Link


HTMLのリンク(a 要素、<a href="...">…</a>、いわゆる a タグ)ひとつを表現するクラスです。
<a href="./index.html">戻る</a>
クライアントサイド・クリックマップ(普通のクリッカブルマップ)の <area> も解釈します。
<area shape="rect" coords="249,33,285,50" href="/weather/jp/hokkaido.html" title="1400" alt="札幌" >
サーバにクリック座標を送るタイプの画像クリックものは Mechanize::Form::ImageButton で扱います。
通常は Mechanize::Page#links に配列で格納されており、Mechanize::Page#link_withMechanize::Page#links_with で抽出されます。
href 属性の値は #href メソッドで、「囲まれた文字列」は #text メソッドで取得できます。クリッカブルマップの座標などを返すメソッドは特にないので、適当に #node から引き出して探したりしてください。

なお、name メソッドが存在しないので agent.page.link_with('click me!').click といった書き方はエラーになります。


Mechanize::Page::Link.new(node, mech, page)

Mechanize::Page::Link オブジェクトを生成します。ユーザーが使用することはありません。

node

このリンクオブジェクトを作成したときに使用した HTML ノードを Nokogiri::HTML::Element? 等で返します。
このリンク自体を表すノードが返ります。中身的には Nokogiri::HTML.parse(このaタグ) です。
Mechanize::Page#link_with で class 属性や id 属性による選択ができないので、この node メソッドが利用されます。
# <a id="return_home"> なリンクを class 属性の値で抽出してクリック
agent.page.links.find{|e| e.node['id'] == 'return_home'}.click

href

このリンクのリンク先 URL を文字列で返します。
パーサが解釈した href 属性の値が返ります。URL として不当であってもそのままですが、HTML の文字参照は Mechanize::Util.html_unescape で解決されています。href 属性自体がない場合は nil が返ります。
URI オブジェクトで欲しい場合は #uri メソッドを使用します。
<a href="./index.html#menu">ホームへ戻る</a>
という HTML で表されるリンクオブジェクトだった場合、href メソッドは文字列 "./index.html#menu" を返します。

text

リンクの内容、つまり、開始タグと終了タグで囲まれた部分を文字列化したものを返します。
いわゆる inner_text で、パーサが解釈した「挟まれた文字列」が返ります。
<a href="./index.html#menu">ホームへ戻る</a>
という HTML で表されるリンクオブジェクトだった場合、text メソッドは文字列 "ホームへ戻る" を返します。<a href="..."></a> という内容が空の状態だった場合は空文字列 "" を返します(nil ではありません)。
<a href="./index.html#menu">
  ホームへ戻る
</a>
という HTML で表されるリンクオブジェクトだった場合、text メソッドは文字列 "\n ホームへ戻る\n" を返します。
文字エンコーディング(と Ruby1.9のEncoding)は UTF-8 で、HTML としての文字参照は Mechanize::Util.html_unescape で解決されています。

空白文字は基本保存されますが、空白文字だけの場合は「最初のタグ」までしか保存されず、以降の空白文字だけの文字列は無視されます。画像を含んでいた場合は、画像だけが挟まれていた場合は alt 属性の値が使用されますが、他の文字が a 要素として存在した場合は alt の存在は無視され、他の文字の連結が返り値となります。
何言ってるかよくわかりませんが、実例を見てもやっぱりなんだかよくわかりません。
<a ...>Ruby</a>               #=> "Ruby"
<a ...></a>                   #=> ""
<a ...>   </a>                #=> "   "(同じ個数)
<a ...><img ... alt="B!"></a> #=> "B!"
<a ...><img ... alt=""></a>   #=> ""
<a ...><img ...></a>          #=> ""
<a ...><img ... alt="B!"><img ... alt="3users"></a>   #=> "B!3users"
<a ...><img ... alt="B!">/<img ... alt="3users"></a>  #=> "/"(altが消える)
<a ...> <img ... alt="B!"><img ... alt="3users"></a>  #=> " "
<a ...><img ... alt="B!"> <img ... alt="3users"></a>  #=> ""(「2番目」以降にある空白は使用されない)
<a ...><img ... alt="B!"><img ... alt="3users"> </a>  #=> ""(「2番目」以降の空白は使用されないんだってば)
<a ...> <img ... alt="B!">   <img ... alt="3users">  \n  </a>  #=> " "(だから「2番目」以降以下同文)
<a ...>a<img ... alt="B!">   <img ... alt="3users">c</a> #=> "ac"(空白特別扱いは「1番目」にあるときのみ)

attributes

alias #node

page

このリンクオブジェクトを作成したときに使用した Mechanize::Page オブジェクトを返します。
通常はこのリンクオブジェクトを含むページオブジェクトが返ります。ユーザーが遡りたい場合に使用します。

to_s

alias #text

referer

alias #page

uri

このリンクのリンク先 URL を Ruby 標準の URI オブジェクトで返します。
#href の値を URI.escape して URI.parse したものが返ります。相対 URL だった場合はそのまま相対 URI なオブジェクトが返ります。
文字列で欲しい場合は #href を使用します。
相対 URL であってもそのまま返します。絶対 URL がほしい場合は Mechanize::Page#uri に + するなどしてください。
return_home_abs_uri = agent.page.uri + agent.page.link_with(:text => /ホームへ戻る/).uri

click

#href の示す URL にアクセスし、サーバからの結果を履歴に登録して返します。
agent.page.link_with(:href => 'index.html').click
Mechanize#click に自分自身を渡しており、リファラとして #page の URL が必ず送られます。アクセスのための Mechanize オブジェクトは Mechanize::Page::Link.new 時に引数で指定されたものになります。