(A1)サイトマップから内部リンクのリストを作る # ライブラリ"hpricot"を使う。HTMLのタグごとにエレメンツに分ける。 require "hpricot" # ライブラリ"open-uri"を使う。開いてHTMLを取る。 require "open-uri" # "http://eri.cheap.jp/site_map/index.htm"を「sitemapurl」という名前にする。 sitemapurl = "http://eri.cheap.jp/site_map/index.htm" # 「sitemapurl」をHTMLのタグごとのエレメンツに分けたもの全体を「doc」という名前にする。 doc = Hpricot(open(sitemapurl)) # 各エレメンツの中で、<a>タグで「href^=http://」のないものの全体を「list」という名前にする。 list = doc.search('a:not([@href^=http://])') # 「list」の1つずつを「link」と呼んで、 # 「link」の中の"href"属性を抜き出したものを「href」と呼んで、 # 「sitemapurl」から見た「href」をあわせて、絶対パスのURLにしたものを出力。 list.each{|link| href = link.get_attribute("href") puts URI.join(sitemapurl , href) }
(A2)おもうことのトップページから内部リンクのリストを作る # ライブラリ"hpricot"を使う。HTMLのタグごとにエレメンツに分ける。 require "hpricot" # ライブラリ"open-uri"を使う。開いてHTMLを取る。 require "open-uri" # "http://eri.cheap.jp/thoughts/index.html"を「sitemapurl」という名前にする。 sitemapurl = "http://eri.cheap.jp/thoughts/index.html" # 「sitemapurl」をHTMLのタグごとのエレメンツに分けたもの全体を「doc」という名前にする。 doc = Hpricot(open(sitemapurl)) # 各エレメンツの中で、<a>タグだけ抜き出したのの全体を「list」という名前にする。 list = doc.search('a') # 「list」の1つずつを「link」と呼ぶ。 # 「link」の中の"href"属性を抜き出したものを「href」と呼ぶ。 list.each{|link| href = link.get_attribute("href") # 全てのエントリは「過去のおもうこと」で網羅できるので、「http://eri.cheap.jp/thoughts/archives.........htm」が入っている行だけ残す。 next unless /^http:\/\/eri\.cheap\.jp\/thoughts\/archives.........htm$/ =~ href puts (href) }
(B)リストにある全てのページにある外部サイトへのリンクを確認して、リンク切れのリストを作る # ライブラリ"hpricot"を使う。HTMLのタグごとにエレメンツに分ける。 require "hpricot" # ライブラリ"open-uri"を使う。開いてHTMLを取る。 require "open-uri" # ↓「linkcheck」メソッドを定義。「linkcheck」は入力したURLが200か調べる。 def linkcheck(url) # puts url # ライブラリ"URI"を使う。URLをホストとパス(前後)に分ける。 uri = URI.parse(url) # ライブラリ"Net::HTTP"を使う。ステータス(200とか404とか)を調べる。 Net::HTTP.version_1_2 begin Net::HTTP.start(uri.host, 80) {|http| response = http.head(uri.request_uri) # ステータスが"HTTPOK"(200)だったら"true"、それ以外は"false"を返す。 case response when Net::HTTPOK return true else return false end } # ↓エラー処理 rescue SocketError return false end # ↑エラー処理 end # ↑「linkcheck」メソッド # ↓「href_linkcheck」メソッドを定義。 # 渡された「line」はこのメソッド内では「page」(引数)として扱う。 def href_linkcheck(page) # URLを「page」という名前にする。 # 「page」を開いて、HTMLのタグごとのエレメンツに分けたもの全体を「doc」という名前にして、 begin doc = Hpricot(open(page)) # ↓エラー処理 rescue OpenURI::HTTPError puts "404 not found " + page return end # ↑エラー処理 # 各エレメンツの中で、<a>タグを探して「list」という名前にする。 list = doc.search('a') # 「list」の1つずつを「link」と呼んで、 # 「link」の中の"href"属性を抜き出したものを「href」と呼ぶ。 list.each{|link| href = link.get_attribute("href") # <a>の中に"href"がなかったら次の<a>に行く(繰り返しの次へ)。 next unless href # URLに「http://」が含まれているか(/ /で囲むと正規表現) next unless /^http:\/\// =~ href # URLに「http://eri.cheap.jp」が含まれているか(/ /で囲むと正規表現) next if /^http:\/\/eri\.cheap\.jp/ =~ href # 「href」に「linkcheck」する。結果が"true"の場合は次へ。 result = linkcheck(href) next if result # 「link」の中に文言か画像(子children)があるので取る。 # とりあえず子の一つ目だけ取って、文字列にする(.to_sで文字列に変換) puts " " + link.children.first.to_s puts " " + href } end # ↑「href_linkcheck」メソッドここまで # このプログラムに対する入力(ARGF)の各行を「line」という名前にして ARGF.each do |line| # その「line」を表示 puts "-----------------------------------" puts line # 「line」の最後の「\n」を削除し、「href_linkcheck」する href_linkcheck(line.chomp) end