タイトルそのままなものを現在作っています。
RSpec使えるといいんだけど自分のスキルだとわからないことだらけなので、まずはTest::Unit 使ってこんなテストを書きました
# test_crawler.rb require 'test/unit' require 'crawler.rb' class TestCase_Crawler < Test::Unit::TestCase def setup @url1 = "http://blog.pasonatech.co.jp/counselor/career_blog/399/15369.html" @crawler = Crawler.new(@url1) @url2 = "http://blog.pasonatech.co.jp/counselor/career_blog/399/15321.html" @crawler2 = Crawler.new(@url2) end def test_set_next_link assert_equal(nil,@crawler.set_next_link) assert_equal("http://blog.pasonatech.co.jp/counselor/career_blog/399/15369.html",@crawler2.set_next_link) end def test_set_title assert_equal("育児:003 ベビーサイン",@crawler.set_title) assert_equal("Lifestyle:002 ベジーな食生活に切り替え中",@crawler2.set_title) end def test_next_page? assert_equal(false,@crawler.next_link?) assert_equal(true,@crawler2.next_link?) end end
crawler.rbの方はこんな感じ。
Rubyっぽい書き方かどうか自信がなかったり、クラスのインスタンス変数とかこうやってコード書いているうちに理解が曖昧っていうことに気づいた。
require 'rubygems' require 'nokogiri' require 'open-uri' class Crawler def initialize(start_url) @doc = Nokogiri::HTML(open(start_url)) end attr_accessor :html_body, :next_link, :title def set_next_link # 最新エントリ以外は次のエントリがないのでそれを判定基準にする result = @doc.search('//p[@class="entrylink"]') @next_link = result.search("a")[1]['href'] if result.text.include?("次のエントリー»") return @next_link end def set_title @title = @doc.search('//div[@class="entry"]').search("h1").text return @title end def set_html_body @html_body = @doc.search('//div[@class="entryText"]').inner_html return @html_body end def next_link? if self.set_next_link === nil then false else true end end end
しかし、毎日初期型MacbookAir持ち歩いて最近ちょっとかばんが重たいと感じることが増えてきたからMacBook Air 11インチ欲しい!なぁ