今日も元気にテクニカル

技術情報書きたいけど本ブログに書きたくないからこんな名前になりました。

本題: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")なんかは普通に記号で囲めばいいけど、あやしい文字列は取りあえずパーセント記法使っておくのが無難です。