2010年 02月09日(Tue) [長年日記]
_ [TCG][プログラム][ruby]ブシロードTCGカードリストリーダー
以前同じものを作ったんだけど、IEが7になったせいか、文字コードのあたりでエラー吐くようになってたので、クラスっぽく書き直した。本当は1行直すだけでOKな気がしたけど。
#coding: utf-8
require 'rubygems'
require 'mechanize'
require 'watir'
module BushiroadTCGReader
class ExpansionList
include Enumerable
def initialize(uri)
@list = []
agent = WWW::Mechanize.new
page = agent.get uri
(page/"div[@id='expansionList'] a").to_a.each{|link|
@list << CardList.new(uri, link.inner_text.strip)
}
self
end
def [](index)
@list[index]
end
def each
@list.each{|i|
yield i
}
end
end
class CardList
include Enumerable
attr_reader :expansion
def initialize(uri, expansion)
@uri = uri
@expansion = expansion
@list = []
end
def get
ie = Watir::IE.new
ie.goto @uri
ie.link(:text, @expansion).click
sleep 2
str = ''
array = []
n = 0
begin
flag = false
ie.document.Links.each{|i|
if i.Href =~ /cardno/
array << Card.new(i.Href)
end
if i.InnerText == '≫'
flag = true
end
}
ie.link(:text, '≫').click if flag
end while flag
ie.close
@list = array
self
end
def [](index)
@list[index]
end
def each
@list.each{|i|
yield i
}
end
end
class Card
include Enumerable
def initialize(uri)
@uri = uri
@array = []
end
def get
agent = WWW::Mechanize.new
page = agent.get @uri
@array = (page/'table.status td').to_a.inject([]){
|array, e| array << e.inner_html
}
self
end
def [](index)
@array[index]
end
def each
@array.each{|i|
yield i
}
end
end
end
Ruby1.9っぽいけど、Nokogiriが動かないので1.8.7でのみ確認。
#coding: utf-8
require 'bushiroad'
require 'kconv'
e = BushiroadTCGReader::ExpansionList.new(
"http://svsm.jp/jsp/cardlist")
e[3].get[7].get.each{|i|
puts i.tosjis
}
と書くとこんな結果。
<img src="../jsp-material/img/t044.gif" alt="カード"><br>
<a href="javascript:void(0);" onclick="JavaScript:showQu
estion('No_T044');">≫ このカードに関するQ&A</a>
浅倉 南<br><span class="kana">アサクラミナミ - マネージ
ャー</span>
<a href="cardlist?cardno=No_T045">上杉 達也</a><br><spa
n class="kana">ウエスギタツヤ - スタート地点</span>
No_T044
U
サンデー
タッチ
<img src="../jsp-material/img/icon_woman.gif">
2
2500
3000
【約束して、必ず勝つって】<br>【自】〔ベンチ〕このカード
がサポートした時、<font color="red">あなたのリングに<img
src="../jsp-material/img/icon_man_s.gif">がいて、あなた
のリタイヤが相手より多いなら、</font>そのアタックはパート
ナーアタックになる。<br><img src="../jsp-material/img/ic
on_hiroin_b.gif"><img src="../jsp-material/img/icon_supo
tu_r.gif">
-<br>
- -
要望を出した人登場wありがとです。<br>プログラム的な詳しいことは解らんけど、使いそうなカードは個人的に修正していきますので〜