#!/usr/bin/env ruby # esbooks.rb # ISBN-search -> detail-parse # original; isbn2bib.rb for bk1 by takahashi # ver.0.4 2002.3.21-2003.11.11 # ver.0.5 2004.01.06-2004.01.06 新cacheに変更 #note: # http://www.esbooks.co.jp/esb/svc/05/05_01_04_00.html # ここを読むと書影のリンク利用は禁止っぽい?(転載にあたるのか?) # それを言うと、書誌情報の利用も怪しいのだが。 #review(読者書評+店長レビュー) #以上、やり残し if __FILE__ == $0 require 'cookie' require 'webagent' require 'cache' require 'cachebib' end class CacheBib_esbooks < CacheBib attr_accessor :rank, :point, :comment def initialize () super @shop_id = 'esb' @url_site = 'http://www.esbooks.co.jp/' @reviews = Array.new() @flag_review = true end #===== ===== parts ===== ===== def word_delivery () delivery = '' flag = false if !@title.nil? # title-check -> no-info / get-info check flag = true if @delivery.nil? delivery = "ない" else if @delivery =~ /翌日〜3日/ delivery = "1〜3日" elsif @delivery =~ /3日〜6日/ delivery = "3〜6日" elsif @delivery =~ /3日〜3週間/ delivery = "3〜21日" else delivery = "?" end end else message("WAR; maybe data-error, no-title.") end return delivery, flag end #===== ===== url ===== ===== def url_isbnsearch ( isbn = @isbn ) url = @url_site + "search?isbn=#{isbn}" return url end def url_bibinfo ( id = @id ) url = @url_site + "product/keyword/keyword?accd=#{id}" return url end #===== ===== parse ===== ===== def parse_isbnsearch ( str ) count = [] str.scan(%r|(.+?)|s){ count << [$1, $2] unless $1.nil? } if count.uniq.size > 1 message("WAR; ISBN-search hit multi-column. ISBN; #{@isbn}") end @id, @title = count.first return count end def parse_bibinfo ( str ) #----- set key and data ------ mode_tbl = { :genre => '', :title => '', :image => '', :label => 'シリーズ名', #'', :author => '著者/訳者名', :publisher => '出版社名', :pubdate => '発行年月', :isbn => 'ISBNコード', :size => 'ページ・サイズ', :price => '販売価格', :stock => '在庫状況', :rank => '売上ランク', :point => '評価ポイント', #'' :desc => '【本の内容】', :comment => '【出版社コメント】', :review => '' # :review => ' 'class="colum-title"', # :image => '/bks/images/i', # :user => '読者対象', #? } mode = :none data = Hash.new() #----- read and sepalate by key(mode_tbl) ------ str.each{|line| l = line.chomp.chomp("\r").kconv(@insystemKcode) mode_tbl.each{ |key,keydata| mode = key if /#{keydata}/s =~ l } if mode != :none if data[mode] data[mode] << l else data[mode] = l end end } #----- parse ----- if !data[:genre].nil? genre = [] data[:genre].scan(%r|([^<]+?)|){ genre << [$1.strip, $2.strip, $3.strip] } @genre = genre.flatten.join("\t") if genre.size > 0 end if !data[:title].nil? if data[:title] =~ /^(.+?)<\/strong>/i @title = $1.gsub(/<[^>]+>/,'').strip end end if !data[:image].nil? if data[:image] =~ %r|]+>/,'').strip if !$1.nil? #labelの後にseriesがついてる場合有 end if data[:author] =~ /:(.*)/ string = $1.gsub(/<[^>]+>/,'').strip if !$1.nil? @author = string.strip if !string.nil? if string =~ /(.*)/(〔ほか〕)?〔?[著|編]〕?/s names = $1.split(/〔?[著|編]〕?[\s| |$]/s) names.collect! { |name| name.strip.chomp('/') } @author = names.join("\t") end if string =~ /.*/(〔ほか〕)?〔?[著|編]〕?(.*)/(〔ほか〕)?〔?訳〕?/s names = $2.split( /〔?訳〕?[\s| |$]/s) names.collect! { |name| name.strip.chomp('/') } names.collect! { |name| name.gsub(/^ */,'').strip } @translator = names.join("\t") end end if data[:publisher] =~ /:(.*)/ @publisher = $1.gsub(/<[^>]+>/,'').strip if !$1.nil? end if data[:pubdate] =~ /:(.*)/ @pubdate = $1.gsub(/<[^>]+>/,'').strip if !$1.nil? end if data[:isbn] =~ /:(.*)/ @isbn = $1.gsub(/<[^>]+>/,'').strip if !$1.nil? # data[:isbn] =~ /:(.*)[ ]?/ # @isbn = $1.gsub(/<[^>]+>/,'').delete(' ').strip if !$1.nil? end if data[:size] =~ /:(.*)/ @pubsize = $1.gsub(/<[^>]+>/,'').strip if !$1.nil? if @pubsize =~ /^(.+?P) (.+)$/ @page, @pubsize = $1.strip, $2.strip end end if data[:price] =~ /:(.*)/ @price = $1.gsub(/<[^>]+?>/,'').gsub(/\s+/, ' ').strip if !$1.nil? end if data[:stock] =~ %r|:(.*)|i @stock = $1.gsub(/<[^>]+>/,'').gsub(/ /, '').strip if !$1.nil? if @stock =~ %r|(.+?)\s*((.+?))|i @stock, @delivery = $1, $2 @stock = @stock.gsub(/<[^>]+>/,'').strip @delivery = @delivery.gsub(/<[^>]+>/,'').strip end end if data[:rank] =~ /:(.*)/ @rank = $1.gsub(/<[^>]+?>/,'').strip if !$1.nil? end if data[:point] =~ %r|:(.*?)|i @point = $1.gsub(/<[^>]+?>/,'').strip if !$1.nil? end if data[:desc] =~ %r|#{mode_tbl[:desc]}(.+?)|i @desc = $1.gsub(/\s+/,' ').gsub(/
/m,"\t").gsub(/<[^>]+>/,'').strip end if data[:comment] =~ %r|#{mode_tbl[:comment]}(.+?)|i @comment = $1.gsub(/<[^>]+>/,'').strip if @comment =~ /[ ]+$/ @comment = $`.strip end end if data[:review] =~ /(合計:(\d+)件)/ @review_num = $1.strip end reviewlist = [] data[:review].scan(%r|(.+?)
(.+?)
(.+?)|mi){ id, page, title, name, desc = $1, $2, $3, $4, $5 value, date = nil, nil id = id.strip page = page.strip name = name.strip if name =~ /^(.+?)\[(.+?)\]\s*−(.+?)$/si name, value, date = $1.strip, $2.strip, $3.strip end desc = desc.gsub(/<[^>]+>/, '').strip reviewlist << [id, page, title, name, value, date, desc] } unless data[:review].nil? @reviewlist = reviewlist.flatten.join("\t") if reviewlist.size > 0 #店長レビューは別頁 "/myshop/#{reviewer}?shelf_id=#{review_page}" end def set_info #===== set book-info(@info) from local-value ===== super #----- set info add ----- #eS! Books独自の情報類 @info["rank"] = @rank #売上ランク @info["point"] = @point #評価ポイント @info["comment"] = @comment #出版社コメント end end if __FILE__ == $0 p CacheBib_esbooks.new.get_data('4-15-010739-4') # p CacheBib_esbooks.new.get_data('4-15-010555-3') # p CacheBib_esbooks.new.get_data('4-592-17702-9') end