歌詞検索エンジン定義ファイル作成方法:歌詞タイム Part 2

HTMLソースを表示する所からです。


まずResult正規表現を設定します。
結果一覧のブロックを抽出するんですが、ブラウザのデバッグ機能を使うと便利でしょう。Fire Foxなら開発ツールのインスペクターで要素を調べることができます。
Resultは本質的には必須ではありません。しかし、Song抽出時にHTML全体からだと変な物を拾ってくる可能性が高くなります。scriptタグ内に出力HTMLを書いているケースとかありますし。
Songできっちり抽出できるのならResultはいい加減でいいし、Songが変な物を拾うのならResultできっちり範囲を区切るという事です。
googleはその点、どちらもややこしそう。というかdiv使いすぎ。DOMやHTMLパーサーを利用してないので複雑な入れ子にはめっさ弱いのよ。
要素としては<div id="search">が結果っぽいです。しかし終わり側は</div>の連続しか無く他にも見られるパターンなので、近くを見て「ウェブ検索結果」と<div id="bottomads">を採用しました。

Result =ウェブ検索結果.+?<div id="bottomads">


次はSong正規表現です。
開始は<div class="g">でOKでしょう。終了は、</div>連続くらいしかない。仕様変更に弱そうだけど仕方ないです。

Song=<div class="g">.+?</div></div></div></div>


そしてTitleとArtistで問題が。
h3タグの所は歌詞タイムの曲ページのtitleタグから来ていて、本来はタイトルとアーティストの間を全角スペース2文字で区切っています。それをgoogleが勝手に半角スペースに置き換えているので、区切りがどこかわからなくなってしまってます。
解決策は無さそう。仕方ないので最後の半角スペースを区切りにする事にします。
アーティストに半角スペースがあると、完全マッチしなくなります。部分マッチにはなるので、検索後△表示から手動でお願いするしかないかな。

Title=<a href="(.+?)" onmousedown=".+?"><h3 class="LC20lb">(.+?) \S+ - 歌詞タイム
Artist=<h3 class="LC20lb">.+\s(\S+) - 歌詞タイム


FirstLineは歌い出しで、検索結果を見ると有ったり無かったりです。
どうも曲名が歌詞中に有るとそれに引っ張られて無くなってしまうようです。ある分は拾っておきましょう。

FirstLine=歌い出し:(.+?)</span>


NextPageは「次へ」の文字があるので場所の特定は楽なんですが、aタグから距離が長いです。
こいうときに.+?が上手く働かない事があります。仕方ないので[^]+?を使って一個一個やっていきましょう。

短い時間に高度な検索(siteオプションの事かな)を何度も行うと、googleBot判定を食らってしまい検索できなくなります。ページめくりで検索数を消耗するのは賢くないのでページ処理は行わない事にします。


検索結果の方はここまでで次は曲ページの方。こちらは比較的簡単です。
歌詞タイムの場合、本文の方の作詞作曲は、やたら空白が多くて面倒そうなんですが、metaタグの方は簡単な形で書いてあるので、そこから持ってきます。
歌詞本体はちょこっとまあなんかやってますが、普通にページの下の方からゲットできます。

Lyricist=作詞:(.+?) 作曲
Composer=作曲:(.+?) 歌い出し
Body=var lyrics = '(.+?)';


これで定義ファイルは完成です。次回最終回はデバッグ方法についてです。