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

2007-03-12

[][] 青空文庫の作品のHTML版のURLを一覧として得る  青空文庫の作品のHTML版のURLを一覧として得る - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  青空文庫の作品のHTML版のURLを一覧として得る - バリケンのRuby日記  青空文庫の作品のHTML版のURLを一覧として得る - バリケンのRuby日記 のブックマークコメント

いままでのまとめだよ。

http://rubyist.g.hatena.ne.jp/muscovyduck/20070205/p1

http://rubyist.g.hatena.ne.jp/muscovyduck/20070207/p1

http://rubyist.g.hatena.ne.jp/muscovyduck/20070226/p1

$KCODE = 's'

base_url = 'http://www.aozora.gr.jp/'
index_dir = 'index_pages'
cards_dir = 'cards'

require 'hpricot'
require 'open-uri'
require 'nkf'

index_pages = open('index_pages.txt') {|f| eval(f.read) }
#index_pages = ["sakuhin_a1.html","sakuhin_a2.html","sakuhin_a3.html"]

def index2cards(url)
  index_page = open(url) {|f| Hpricot.parse(NKF.nkf('-s', f.read)) }
  index_page.search("center table:nth-child(1) tr td a").map {|e|
    [e.inner_text, e['href']]
  }
end

def card2book(url)
  book_card = open(url) {|f| Hpricot.parse(NKF.nkf('-s', f.read)) }
  book_link = book_card.at("a[text()*='HTML版で読む']")
  return nil if book_link.nil?
  book_url = book_link['href']
  book_url = File.join(File.dirname(url), book_url) unless book_url.match(/\Ahttp:\/\//)
  book_url
end

books = index_pages.map do |i|
  open(File.basename(i, File.extname(i)) + ".txt", "w") do |f|
    f.write("[\n")
    index2cards(File.join(base_url, index_dir, i)).map do |j|
      book = card2book(File.join(base_url, cards_dir, j[1]))
      next if book.nil?
      f.write(' ["' + j[0] + '",' + "\n")
      f.write(' "' + book + '"],' + "\n")
    end
    f.write("]\n")
  end
  sleep 30 # 青空文庫へのDOS攻撃にならないように‥‥
end

青空文庫インデックスページは、index_pages.txtというファイルリテラル形式で保存してあるよ。

出力は、インデックスページの「.html」を「.txt」に変えた名前に、「作品名」と「その作品のHTML版のURL」を配列としてリテラル形式で保存しているよ(HTML版がない作品は除外しているよ)。

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