練習 3-4

初級者向けレッスンの宿題。

文字列から抽出する練習問題。

空気を読んで出題者の意図通りに。

require 'open-uri'

RUBY_VERSION        # => "1.9.2"

puts open('http://www.google.com', 'r:cp932', &:read).
  gsub(/\n/, ' ').
  split(%r|</a>|).
  map{|i|i.sub(/^.*<a/, '')}.
  map{|i|[$1, $2.strip] if /href="(.*?)".*>(.*)/ =~ i}.
  compact.
  map{|url, text|"#{text} <#{url}>"}

# >> 画像 <http://www.google.co.jp/imghp?hl=ja&tab=wi>
# >> 動画 <http://video.google.co.jp/?hl=ja&tab=wv>
# >> 地図 <http://maps.google.co.jp/maps?hl=ja&tab=wl>
# >> ニュース <http://news.google.co.jp/nwshp?hl=ja&tab=wn>
# >> 書籍 <http://books.google.co.jp/bkshp?hl=ja&tab=wp>
# >> Gmail <http://mail.google.com/mail/?hl=ja&tab=wm>
# >> &raquo; <http://www.google.co.jp/intl/ja/options/>
# >> iGoogle </url?sa=p&pref=ig&pval=3&q=http://www.google.co.jp/ig%3Fhl%3Dja%26source%3Diglk&usg=AFQjCNEmQuNg1ivauCid9lXp5yYSx6AHXw>
# >> 設定 </preferences?hl=ja>
# >> ログイン <https://www.google.com/accounts/Login?hl=ja&continue=http://www.google.co.jp/>
# >> 検索オプション </advanced_search?hl=ja>
# >> 言語ツール </language_tools?hl=ja>
# >> 広告掲載 </intl/ja/ads/>
# >> Google について </intl/ja/about.html>
# >> Google.com in English <http://www.google.com/ncr>
# >> プライバシー </intl/ja/privacy.html>

サイト内の絶対パスとかきもい。*1

  1. html 取得。
  2. html 内の改行を捨てる。
    1. タグの途中で改行されてるかもだから
    2. 空白にせずに捨てても OK?
  3. anchor の終わりで分割。
  4. anchor の始まりまで捨てる。
  5. 文字列とURLを抽出。
  6. 最後の anchor 以降を捨てる。
  7. 出力用に整形。

やっぱり文字コードのとこがダサい。

解答例にあるみたいに nokogiri とか使いたい。勉強しよう。

*1:相対パスも同じだろうな。