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