2014年7月20日日曜日

Webページを解析する

Yahoo競馬からデータを取得すると決めた。APIが用意されているわけではないので、HTMLを解析し、必要な部分を抜き出さなくてはならない。

public HtmlAnalyzer(String html) {
buf = new StringBuffer(html); 

}
public String getData(String begin, String end) {
int ibegin = buf.indexOf(begin);
if (ibegin == -1) return null;
ibegin += begin.length();
buf.delete(0, ibegin);
int iend = buf.indexOf(end);
if (iend == -1) return null;
String ret = buf.substring(0, iend);
buf.delete(0, iend + 1);
return ret;

}

上記のように、HTMLをStringBufferに入れて、解析した部分から消していくことにした。解析として、ある文字列とある文字列の間の文字列を取り出す関数を作った。そして、HTMLのソースファイルを見ながら、必要な部分の前後の文字列を切り出し、上記関数getDataの引数として与えるようにした。
<p id="raceTitDay" class="fntSS">2000年1月5日(水) <span>|</span> 1回中山1日 <span>|</span> 10:00発走</p> 
HTMLのソースファイルで、日付と開催日と場所の情報は上記のように書かれている。そこで、以下のようにgetDataを呼び出してデータを取得するようにした。

HtmlAnalyzer ha = new HtmlAnalyzer(html);
Race race = new Race();
race.horses = new ArrayList<Horse>();
String date = ha.getData("<p id=\"raceTitDay\" class=\"fntSS\">", "<span>");
SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日");
race.date = format.parse(date);
race.termplaceday = ha.getData("</span>", "<span>").trim();

多くのデータがあるため、かなり面倒だが、基本的には同じように書いて行けばよい。難しいのは、どこまで可変でどこまで固定なのかということだ。HTML自体は、データを埋め込んで自動生成しているのだろうから、基本的には同じ枠組みで作られているはずだ。しかし、どこが埋め込み部分なのか判断が難しい場合もあるので、試行錯誤が必要だろう。

0 件のコメント:

コメントを投稿