本題:newsingの新着記事リストから個別記事URLを取得する
ということで、newsingの新着記事リストから個別記事URLを取得する。
※newsingの新着記事のアドレス体系は
http://newsing.jp/list?start=x0 (x=1,2,3...)
となっている。
require 'hpricot' require 'open-uri' require 'kconv' list = Array.new maxtop = 1 0.upto(maxtop) do |i| doc = Hpricot(open("http://newsing.jp/list?start=#{i}0")) (doc/"a.medium").each do |elem| list << elem.to_html.tosjis.sub(/\n.*/,"").sub(%Q[<a href="],"").sub(%Q[" class="medium">],"") if %r[コメントを見る] =~ elem.to_html.tosjis end end
ちなみに今までのロジックは↓な感じ。ソースにアクセスして1行ずつ読み込んでます。↑との文字コードの違いは気にしないで下さいw
0.upto(maxpage) do |i| listIO = open("http://newsing.jp/list?start=#{i}0") listhtml = Kconv.toeuc(listIO.read) listhtml.each_line do |line| list << (line.sub(/^.*<a href="/,"").sub(/" class="medium">/,"")) if /icn_comment.gif" alt="コメント"/ =~ line end end end
コード量は変わってないけど、スマートさ、分かりやすさではHpricot使ったほうがいいかなー。それにマッチさせる要素が増えれば増えるほど、ソースを1行ずつ読み込んで…ってのは大変になるような気がします。それにタグ複数行にまたがってる場合の対応が大変だしね。
余談。パーセント記法。
- %Q[]:""で囲んだ文字列
- %q[]:''で囲んだ文字列
- %r[]://で囲んだ文字列(正規表現)
です。くくる括弧は"[]"でなくて、"()"その他でも大丈夫。パーセント記法を使う利点は、文字列の中で「"」や「'」や「/」が使えること。例えば正規表現で"http://newsing.jp/"をマッチさせる場合、
通常 /http:\/\/newsing.jp\// パーセント %r[http://newsing.jp]
となる。
単純な文字列、例えば2行目のopen("http://newsing.jp/list?start=#{i}0")なんかは普通に記号で囲めばいいけど、あやしい文字列は取りあえずパーセント記法使っておくのが無難です。