バリケンのRuby日記 RSSフィード

2007-01-29

[] scrAPIを使ってみる(5)  scrAPIを使ってみる(5) - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  scrAPIを使ってみる(5) - バリケンのRuby日記  scrAPIを使ってみる(5) - バリケンのRuby日記 のブックマークコメント

昨日のをもうちょっといじって、「asahi.comの速報記事一覧からリンクされている記事を全部、テキストファイルに整形してダウンロードする」headlines2.rbを作ってみるよ(Windows版)。

$KCODE='s'

require 'scrapi'

class String
  # excerpt from http://wota.jp/ac/?date=20070115#p01
  def scrape(pattern, options = {}, &block)
    options = {:extract=>options} unless options.is_a?(Hash)
    options[:parser_options] = {:char_encoding=>'shiftjis'}.merge(options[:parser_options]||{})
    extract = options.delete(:extract) || block && :element || :text
    scraped = Scraper.define do
      process pattern, "matches[]"=>extract
      result :matches
    end.scrape(self, options) || []
    block ? scraped.map{|i| block.call(i)} : scraped
  end
end

class HTML::Tag
  # excerpt from http://wota.jp/ac/?date=20070115#p05
  def text() Scraper::Base.text(self) end
end

require 'open-uri'
require 'nkf'

def asahi2txt(url)
  html = NKF.nkf('-s', open(url).read)
  title = html.scrape("title")[0].gsub!(/ /m,' ')
  image = html.scrape("#con1 img", "@src")
  body = []
  body.push('■' + html.scrape("#con1 h1")[0])
  body.push(url)
  body.push("")
  match_data = html.scrape("#con1")[0].match(
    /\r\n(\d+年\d+月\d+日\d+時\d+分)\r\n(.*)<!-- google_ad_section_end/m
  ).to_a
  body.concat(
    NKF.nkf(
      "-sf72",
      match_data[2].gsub(
        /<!-- Start of photo -->(?:\r\n)+/m,
        "\r\nhttp://www.asahi.com" + image[0] + "\r\n"
      ).gsub(/<!--.*?-->/m,'').gsub(/\s/,"\n")
    ).to_a.map{|i| i.chop}
  )
  body.push("")
  body.push(match_data[1])
  return [title, body]
end

html = NKF.nkf('-s', open("http://www.asahi.com/list.html").read)
html.scrape("#con1 li a:nth-child(1)", "@href").each{|url|
  entry = asahi2txt("http://www.asahi.com" + url)
  unless File.exist?(entry[0] + ".txt")
    open(entry[0] + ".txt", "w"){|f|
      entry[1].inject(""){|result,item|
        unless item.empty?
          f.write(item + "\n")
        else
          f.write("\n") unless result.empty?
        end
        item
      }
    }
  end
}

これをテキストエディタか何かでheadlines2.rbとして保存して、コマンドプロンプトで

> ruby headlines2.rb

とすれば、実行したディレクトリに記事をテキストに整形したファイルが大量にできているはずだよ。

追記:いまのところ、次のような問題があるよ。

  • 記事の中に画像が複数あると、画像のURLがうまく取得できない
トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20070129