Gatherer のデータベースは便利なんですけど、オンラインになっていないと使えません。
そんなときはローカルでカードテキストファイルを持って置けばよいのですが、
現在のGatherer では、テキストで一括ダウンロード、というオプションがありません。
とはいえ、全表示オプション(mjmj.info 参照)を使用すると、PCとブラウザによっては
メモリーフローを起こして死んでしまいます。
なのでやっぱりテキストデータが欲しい。となるわけです。今日はそんな方法の覚書。
以下はWindowsとMacOSXでやり方が多少異なります。
#cygwin 1.7.1 上でcurlセットをインストールして実行すると、上記URIではエラーが出ます。
#おそらくwin上でのアンパサンドをアンパサンドと認識してくれない模様。
#うまくいかない場合は、Windows用のcurl と OpenSSLをインストールして、
#MS-DOSプロンプト上から実行してみて下さい。
#これもcygwin 1.7.1 ではエラーが出るようです。改行コードをLFにしたら直りましたが、
#妙なファイルが残ってしまうのと、バッチ処理が終了しません。
#sed コマンドを一行ずつ実行するのがもっとも正攻法のようです。
基本的にFreeBSD準拠のコマンドを使用しますが、Windowsだと cygwin が走れば大丈夫です。
MS-DOSプロンプトでも代用はできますが、置換操作でsedが使用できないので、適宜判断して差し替えてください。
また、Windowsにせよ、MacOSXにせよ、テキストエディタは必須です。
複数のエンコーディングをサポートしているものを選びましょう。
筆者は Windowsでは xyzzy, MacOSXでは mi を使用しています。
1) cURL を使えるようにする
cURL は、コマンドラインからhttpやftpなどのURI を展開できるコマンドです。
cURL : http://curl.haxx.se/
Windowsの場合は上記サイトから引っ張ってきます。
通常はMS-DOSプロンプトから実行する形になります。
cygwin を使えるのであれば、cygwin 内から呼び出せます。
MacOSXではあれば、最初からインストールされています。ターミナルから以後続けます。
2) cURL を使って Gatherer からデータを引っ張る
ここからはコマンドラインを使用します。
> curl -L http:[Gatherer のURI] > [適当なファイル名].html
とします。プログレスバーが出てDLが始まります。
全カードテキスト表示オプション (ttp://gatherer.wizards.com/Pages/Search/Default.aspx?output=spoiler&method=text&text=+%5b%5d)
だと、20MB強あるのでまったりお待ちください。
適当なファイル名をつけて保存します。(以下では gatherer.html と書きます)
作業を行った日付を書いておくとよいでしょう。
#cygwin 1.7.1 上でcurlセットをインストールして実行すると、上記URIではエラーが出ます。
#おそらくwin上でのアンパサンドをアンパサンドと認識してくれない模様。
#うまくいかない場合は、Windows用のcurl と OpenSSLをインストールして、
#MS-DOSプロンプト上から実行してみて下さい。
3) エンコードを考える
こうしてDLできたHTML内の文字列を操作する訳ですが、
以下の操作では、途中で改行コードを考えないといけません。
ファイルをテキストエディタで見るなりしてエンコードを確かめましょう。
utf-8n で LFもしくはCR+LF になっているはずです。
ファイルをテキストエディタで見るなりしてエンコードを確かめましょう。
utf-8n で LFもしくはCR+LF になっているはずです。
Windowsなら特に意識しなくてもいいのですが、
MacOSXでは先にperl を使って改行コードを LFに直しておくと便利です。
> perl -pe 's/\r\n/\n/' gatherer.html > gatherer_LF.html
とでもしておきましょう。
4) 文字列を操作し、要らないタグや空白を消す。
ここから先は、地道にタグを手で消していく手もありますが、流石に全カード分だと
量が多すぎるので、コマンドラインで自動化してしまいましょう。
ここでは文字列操作として sed を使用した例を示します。
---------------------------------------------
start=`grep -n "<table>" $1 | sed -e 's/:.*$//'`
end=`grep -n "</table>" $1 | sed -e 's/:.*$//'`
filename="oracle"`date +%Y%m%d`".txt"
sed -e "1,${start}d" -e "${end},\$d" $1 > op.1.trim
sed -e 's/^[ ]*//' op.1.trim > op.2.trim
sed 's/^<[^>]*>//' op.2.trim > op.1.trim
sed 's/<.*>//' op.1.trim > op.2.trim
sed 's/^[^N].*:$//' op.2.trim > op.1.trim
sed -e '/^$/d' op.1.trim > $filename
rm *.trim
------------------------------
以上がシェルスクリプトになります。これを適当な名前(test.sh)で保存し、実行権限をつけて
> ./test.sh gatherer.html
とすればよいです。
#これもcygwin 1.7.1 ではエラーが出るようです。改行コードをLFにしたら直りましたが、
#妙なファイルが残ってしまうのと、バッチ処理が終了しません。
#sed コマンドを一行ずつ実行するのがもっとも正攻法のようです。
何をやっているかどうかは以下に。
4-1) tableタグの内部がカードテキスト本体なので、grep で行番号を探し、その前後を消す。
4-2) 行頭の空白を全て抜く。
4-3) タグで始まる行のタグを全て消す。
4-4) 上で抜いたタグ以外のタグを全て消す。
4-5) Name: で始まる行以外で、コロンのついている文字列を消す。(Type: 等)
4-6) 空行を全て削除
4-7) 中間生成ファイルを全て消す
こうして出来上がったファイルは、各カードが "Name:" で区切られたテキストファイルになります。
だいたい2.5Mほどにまで落ちます。
5)手直しをする
どうしても自動化できない部分があるので、以下の点を直します。
・日本語テキストをくっつける場合、utf-8 から sjis に直した方がよい。
・"Ach! Hans, Run!"のダブルクォーテーションを外しておく。(色々面倒)
・AEther 等の "AE" が1バイト文字で表現されている場合は"AE"と直す。
(クリップボードの関係で、検索では引っかからない。AEther がほとんど。)
AErathi Berserker (AErathi Berserker)くらいが例外。
"Ather" となる場合もある。この場合は単純に置換するだけで良い。
・サブタイプを示す傍線が ? になっているので置換する。
" ? " -> " - " と置換すると一番楽。
これであなたの手元にも、オラクル・テキストが常備できます。
次はこれをiPodへ入れるべく辞書化してみましょう。
コメントする