前回の問題への対応を今日は考える。
このままだと、読み進めても、動作が違ってしまう。
やはり、支障あるかと思い、プログラムの改造を試みる。
現在のソフトバンクのページのHTMLのソースコードから、
上場市場と単元株数に該当する部分を見つけて、抜き出す。
そのためのパターンを新たに用意し、既存同様に動作させる。
それが目的。
で、lib/stock_list_maker.rbファイルを以下のように改造。
# HTMLから銘柄情報を抜き出す
def parse(text)
data = Hash.new
sections = []
#修正開始
#reg_market = /yjSb">([^< ]+) ?</
#reg_unit = %r!<dd class="ymuiEditLink mar0"><strong>((?:\d|,)+|—)</strong>株</dd>!
#text.lines do |line|
# if line =~ reg_market
# sections << $+
# elsif line =~ reg_unit
# data[:market_section] = sections[0]
# data[:unit] = get_unit($+)
# return data
# end
reg_market = %r!<div class="stockMainTabParts stockMainTabPartsCurrent"><span class="stockMainTabName">([^< ]+) ?</span>!
reg_unit1 = %r!<dl class="tseDtlDelay"><dd class="ymuiEditLink mar0"><strong>((?:\d|,)+|—)</strong>株</dd>!
reg_unit2 = %r!<dt class="title">単元株数!
data[:unit] =""
text.lines do |line|
if data[:unit] != ""
if line =~ reg_unit2
data[:market_section] = sections[0]
return data
else
data[:unit] =""
end
elsif line =~ reg_market
sections << $+
elsif line =~ reg_unit1
data[:unit] =get_unit($+)
end
end
#修正ここまで
data
end
もっと簡潔に書けるのでしょうけど、今のワタクシには正確に分かりません。
そのツッコミは無しで、思い浮かんだ処理の流れに素直に書きました。
マッチさせる文字列は敢えて、長めに取りました。
その方が分かりやすいから。
上場市場の方は、
stockMainTabPartsの最初のところなので見つけるのは比較的容易です。
単元株数は若干厄介で、
表示上は「単元株 999,999株」と見えるんですが、
HTMLのソースコードは逆。データ→見出しの順で書かれ、
しかも改行されてる。
最初の行の条件だけだと、「出来高」がヒットしてまう。
更に、
この改行が任意なのか固定なのかも分かりません。
しかし、任意と考えるともっと修正長くなるし、
多少検索からこぼれてしまっても、動作確認は出来るだろうから、
改行されると決め打ちしました。
とすると、
判定は必ず2行にわたるので、
最初の行はymuiEditLinkの要素で、「株」と単位が付くもの。で、
次の行は、「単元株数」という文字が出て来るもの。
となります。
で、処理は、
data[:unit]にデータがあれば、単元株数の一行目ヒットした直後なので、
この行が単元株数の二行目かどうか判定する。
ヒットなら確定。
ヒットしなければ、data[:unit]をクリアして、以下繰り返し。
それ以外(data[:unit]にデータ無し)なら、
上場市場、単元株数の一行目を順に探す。
どちらかがヒットしたら、それぞれデータを格納。
以下繰り返し。
これで、プログラムを実行すると、
1300-9999の範囲の銘柄コードに対して、
3493件のデータが取得できました。
違う部位のデータを取るということは無いようです。
取りこぼしについては分かりませんが、
動作確認上はこれだけあれば、問題ないでしょう。
これで安心して、本書に戻れます。
なお、ソースコード等をこのブログで表示するため、
↓にお世話になりした。逆変換も可能とのことです。
HTML特殊文字変換ツール
http://tech-unlimited.com/escape.html
質問コーナー、お問い合わせは、sanpome.net@gmail.com まで。