#!/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