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

2007-01-28

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

いままでのことを応用して、「asahi.comの記事のURLを与えると、記事のタイトルと本文をテキスト配列として返すasahi2txtメソッド」を定義してみるよ。

def asahi2txt(url)
  html = NKF.nkf('-s', open(url).read)
  title = html.scrape("title")[0].gsub!(/ /m,' ')
  body = '■' + html.scrape("#con1 h1")[0] + "\n"
  body += url + "\n\n"
  body += NKF.nkf("-sf72", html.scrape("#con1")[0].match(/\r\n\d+年\d+月\d+日\d+時\d+分\r\n(.*)<!-- google_ad_section_end/m).to_a[1].gsub!(/<!--.*?-->/m,'').gsub!(/\s/,"\n"))
  body += "\n" + html.scrape("#con1 div")[0]
  return [title, body]
end

じゃあ、このasahi2txtメソッドを使って「asahi.comの主要ニューステキストファイルとしてダウンロードする」headlines.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!(/&amp;#160;/m,' ')
  body = '■' + html.scrape("#con1 h1")[0] + "\n"
  body += url + "\n\n"
  body += NKF.nkf("-sf72", html.scrape("#con1")[0].match(/\r\n\d+年\d+月\d+日\d+時\d+分\r\n(.*)<!-- google_ad_section_end/m).to_a[1].gsub!(/<!--.*?-->/m,'').gsub!(/\s/,"\n"))
  body += "\n" + html.scrape("#con1 div")[0]
  return [title, body]
end

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

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

> ruby headlines.rb

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

トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20070128