最近の中学生のはじめてのプログラミング言語がJavaScriptだったりするこの時代、最も使いやすいJavaScriptの実行環境であるFirebugは現代のコマンドラインです。UNIXコマンドラインでgrep
やuniq
を使って、日常の細々した処理を行うのと同じようにFirebugとjavascriptを使いこなせると、日常作業のちょっとしたことをさくっとこなすことができます。ちょっとした作業だから手作業でやってもいいけど自動でやればミスったりしないし、気分的には楽なので自動でやりたい、という作業がけっこうないでしょうか。例えば、ページの中の特定の部分の文字列をリストにしてテキストファイルに保存したい、とか。
そこで今回は私が普段よくやっている単純作業をFirebug+javascriptでさくっとかたづける方法を2回にわけてご紹介します。
var total = 0;
var a = $x("//li/a/sup");
for ( var i = 0; i < a.length; i++ )
total += parseInt( a[i].textContent );
total // 210
XPathで対象のsup
要素を全部取り出して、その中の数字を足しています。textContent
プロパティには要素の子孫にあるテキスト全部が入っています。そのまま+演算子で足していくとタグの数が文字列として連結されていってしまうのでparseInt()
を使って数値として足し算されるようにしています。
WebKitでサポートされているJavaScript1.6のべんりなArrayメソッドで紹介したArrayの拡張メソッドを使って
var total = 0;
$x("//li/a/sup").map ( function (a) {
return total += parseInt( a.textContent );
} ).pop(); // 210
と書くことも可能です(Firebug consoleではjavascript1.6までしか使えないようなのでreduce
は使えません)。
div[@class="pager"]
というふうに書かないといけません。それに比べてCSSセレクタなら同じことを div.pager
とかけるのですごく楽です。
こんどははてなブックマーク - いまさら人に聞けない Firebug tipsにつけられたタグを全部リストアップしてみましょう。つけられている数が少ないタグは"タグ"のところにはでてこないので、各ブックマークにつけられたタグを全部とりだします。
こういうHTMLなので、こんどはCSSセレクタを使って取り出します。
var stash = {};
$$("a.user-tag").map ( function (a) {
stash[a.textContent] = stash[a.textContent] ?
stash[a.textContent] +1 : 1;
} );
stash
これで、タグ名をキー、タグの総数が値になったハッシュを取り出すことができます。
copy()
という、渡された文字列をOSのクリップボードにコピーする関数があります。
さっき作ったタグ名とタグの数ハッシュを、タブ区切りのファイルにして保存したい、というのを想定してみましょう。
copy(
keys(stash).map ( function (k) {
return [k, stash[k]].join("\t")
} ).join("\n")
);
Firebugにはkeys()
というperlのkey
に相当する関数があり、ハッシュからキーだけを配列にして返してくれます。これを使って全部のキーと値を取り出して、join()
で改行をはさんで連結してクリップボードに保存しています。
クリップボードにデータが入ったら適当なエディタに張り付けて保存すればタブ区切りのファイルのできあがりです(タブがみにくくてすみません)。
$$('table a').map ( function (a) { return a.textContent })
と入力するだけで、簡単に取り出すことができます。
ウェブとコンピュータとを繋ぐブラウザは現代のコマンドラインです。ちょっとでもコマンドラインを使えると飛躍的に細かい作業がはかどるのと同じように、Firebugで細かい作業ができるようになると、ウェブの情報を簡単に利用することができるようになります。
次回はもう一歩進めてFirebugからHTTPリクエストを送ったりします。それではまた。
トラックバック元エントリにこのエントリへのリンクがない場合はトラックバックを受け付けません。
http://labs.gmo.jp/mt/mt-tb.cgi/228
comments