#!/usr/bin/env ruby # yahoo.rb(books) Yahoo!JAPAN BOOKSはeS! Booksとの提携によります。 # ISBN-search -> detail-parse # original; isbn2bib.rb for bk1 by takahashi # ver.0.1 2003.1.19-2003.1.20 # ver.0.2 2004.01.05-2004.01.05 新cacheに変更 #読者レビュー(代表5評/別頁) #「みんなの書店」レビュー(別頁) #検索時のtableからの情報抽出 #以上、やり残し if __FILE__ == $0 require 'cookie' require 'webagent' require 'cache' require 'cachebib' end class CacheBib_yahoo < CacheBib attr_accessor :user attr_accessor :review_point, :reviews_id # attr_accessor :ownerreviewlist def initialize () super @shop_id = 'yho' @url_site = 'http://books.yahoo.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 =~ /1日〜3日/ delivery = "1〜3日" elsif @delivery =~ /3日〜6日/ #??? 存在しない? delivery = "3〜6日" elsif @delivery =~ /3日〜3週間/ delivery = "3〜21日" elsif @delivery =~ /お取り扱いできません/ delivery = "不可" 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 + "bin/search_key?p=#{isbn}" return url end def url_bibinfo ( id = @id ) url = @url_site + "bin/detail?id=#{id}" return url end #===== ===== parse ===== ===== def parse_isbnsearch ( str ) count = [] str.scan(%r|(.*?)|){ 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 = { :image => '書籍画像', :publisher => '出版社名', :title => '書籍名', :label => 'シリーズ名', :author => '著者名', :pubdate => '出版年月 ', :size => 'ページ数・版型 ', :isbn => 'ISBNコード', :price => '価格', :stock => 'esbooksカート', :desc => '内容', :index => '目次 ', :user => '読者対象', :review => '' #読者レビュー } 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[:image].nil? if data[:image] =~ /#{mode_tbl[:image]}.+?(/smi tmp = $1 if tmp =~ //smi @publisher = $1.gsub(/<[^>]+>/,'').strip end end if !data[:title].nil? if data[:title] =~ /#{mode_tbl[:title]}.+?(/smi @title = $1.gsub(/<[^>]+>/,'').strip end end if !data[:label].nil? if data[:label] =~ /#{mode_tbl[:label]}.+?(/smi @label = $1.gsub(/<[^>]+>/,'').strip end end if !data[:author].nil? if data[:author] =~ /#{mode_tbl[:author]}.+?(/smi @author = $1.gsub(/<[^>]+>/,'').strip authors, translators = [], [] @author.scan(/(.+)\/著/){ |author| authors << author } @author.scan(/([^\s]+)\/訳/){ |translator| translators << translator } @author = authors.join("\t") if authors.size > 0 @translator = translators.join("\t") if translators.size > 0 end end if !data[:pubdate].nil? if data[:pubdate] =~ /#{mode_tbl[:pubdate]}.+?(/smi @pubdate = $1.gsub(/<[^>]+>/,'').strip end end if !data[:size].nil? if data[:size] =~ /#{mode_tbl[:size]}.+?(/smi @pubsize = $1.gsub(/<[^>]+>/,'').strip if @pubsize =~ /^(.+P)(.+)$/ @page, @pubsize = $1.strip, $2.strip end end end if !data[:isbn].nil? if data[:isbn] =~ /#{mode_tbl[:isbn]}.+?(/smi @isbn = $1.gsub(/<[^>]+>/,'').strip end end if !data[:price].nil? if data[:price] =~ /#{mode_tbl[:price]}.+?(/smi @price = $1.gsub(/<[^>]+>/,'').strip end end if !data[:stock].nil? if data[:stock] =~ /#{mode_tbl[:stock]}.+?(/smi @stock = $1.gsub(/<[^>]+>/,'').strip if @stock =~ /^(.+)((.+))$/ @stock, @delivery = $1.strip, $2.strip else @delivery = @stock end end end if !data[:desc].nil? if data[:desc] =~ /#{mode_tbl[:desc]}.+?(/smi @desc = $1.gsub(/\s+/mi,' ').gsub(/
/mi,"\t").gsub(/<[^>]+>/,'').strip end end if !data[:index].nil? if data[:index] =~ /#{mode_tbl[:index]}.+?(/smi @index = $1.gsub(/\s+/mi,' ').gsub(/
/mi,"\t").gsub(/<[^>]+>/,'').strip end end if !data[:user].nil? if data[:user] =~ /#{mode_tbl[:user]}.+?(/smi @user = $1.gsub(/<[^>]+>/,'').strip end end if !data[:review].nil? if data[:review] =~ /読者の採点:.+?((.+?))/smi @review_point = $1.gsub(/<[^>]+>/,'').strip end if data[:review] =~ %r|すべてのレビューを見る \((.+?)\)|mis url, @review_num = $1.strip, $2.strip @review_num.chomp!('件') if url =~ /sid=(\d+)/ @reviews_id = $1.strip end end if @reviews_id.nil? if data[:review] =~ %r|レビューを書く|mis @reviews_id = $1.strip end end reviewlist = [] data[:review].scan(%r|(.+?)|mi){ |rev_str| rev_str = rev_str.to_s title, reviewer, date, value, comment = nil, nil, nil, nil, nil if rev_str =~ %r|(.+?)\s+投稿者:(.+?) (.+?)
(.+)|smi title, reviewer, date, comment = $1, $2, $3, $4 title = title.gsub(/<[^>]+>/,'').strip reviewer = reviewer.gsub(/<[^>]+>/,'').strip date = date.gsub(/<[^>]+>/,'').strip value = 0 comment.scan(/1s.gif/){ value += 1 } comment = comment.gsub(/<[^>]+>/,'').strip if comment =~ /^-\s*/ comment = $' end reviewlist << [title, reviewer, date, value, comment] end } @reviewlist = reviewlist.flatten.join("\t") if reviewlist.size > 0 end #読者レビューは別頁 "http://messages.yahoo.co.jp/bbs?.mm=&action=l&tid=#{id}&sid=#{reviews_id}" #店長レビューは別頁 "/esb_review/#{id}.html" end def set_info #===== set book-info(@info) from local-value ===== super #----- set info add ----- #yahoo独自の情報類 @info["user"] = @user #読者対象 @info["review_point"] = @review_point #読者レビュー平均点 @info["reviews_id"] = @reviews_id #レビュー制御用ID @info["reviewlist"] = @reviewlist #レビューリスト # @info["ownerreviewlist"] = @ownerreviewlist #店長レビューリスト end end if __FILE__ == $0 p CacheBib_yahoo.new.get_data('4-15-010739-4') # p CacheBib_yahoo.new.get_data('4-10-610003-7') # p CacheBib_yahoo.new.get_data('4-594-04256-2') end