プログラムいらず!vimで手動スクレイピングという記事があったので、Atomでもやってみた。
vimの場合はexコマンドの組み合わせで実現していたが、AtomならばJavaScriptを使うので「プログラムいらず!」とはならないが、やってみるのも一興であろう。
「表示」 > 「開発」 > 「デベロッパー ツール」からデベロッパーツールを開き、新しいタブを開いた上で下記JavaScriptを実行すると動く。
正規表現による力技
require("http").get("http://b.hatena.ne.jp/ctop/it", function(r){var b = "";r.on("data", function(c){b += c});r.on("end", function(){b.replace(/\n/g, "").match(/<a[^>]*href="([^"]+)"/g).forEach(function(m){atom.workspace.getActiveTextEditor().insertText(m.replace(/<a[^>]*href="([^"]+)"/, function(){return arguments[1] + "\n"}))})})})
なにこれきもちわるい。
DOMオブジェクトにしてみる
Vimは行指向の編集が出来るから、正規表現による力技でもスマートにやれるのだろう。
ならばAtomはJSを扱える強みを生かしてDOMオブジェクトから抽出するのがスマートであるはずだ。
require("http").get("http://b.hatena.ne.jp/ctop/it", function(r){var b = "";r.on("data", function(c){b += c});r.on("end", function(){var p = new DOMParser();var d = p.parseFromString(b, "text/html");[].forEach.call(d.querySelectorAll("a"), function(a){atom.workspace.getActiveTextEditor().insertText(a.getAttribute("href") + "\n")})})})
なにこれきもちわるい。
結論
やる前から分かっていたことだが、素直にプログラム書いて、scriptなりで実行した結果をコピペしたほうがすっきり書けるようだ。
なお、他のOSではどうか知らないが、Windows版であればCtrl + o
で開くファイル選択ダイアログの「ファイル名」にURLを貼り付けて「開く」とするとファイルをダウンロードしてから開いてくれるので、参考までに。
(これはAtomに限らずWindowsの「ファイルを開く」ならば大体利用できる)
補足
標準状態で扱えるモジュールのみで完結させようとしたためhttp
モジュールやDomParser
を使用しているが、恐らくrequest
モジュールやcheerio
モジュールを使ったほうがスマートに書けるであろう。
しかし、Vimは標準で扱えるものだけで実現していたため、今回はあえてこれらのモジュールを使わずに泥臭く書いている。
最後に、上記のコードをatom-beautifyで整形したものを掲載する。
「ここをこうしたらもっと短くなるのでは」というアイデアがあればコメントにてお教えいただければ幸いである。
"正規表現による力技"の整形
require("http").get("http://b.hatena.ne.jp/ctop/it", function(r) {
var b = "";
r.on("data", function(c) {
b += c
});
r.on("end", function() {
b.replace(/\n/g, "").match(/<a[^>]*href="([^"]+)"/g).forEach(function(m) {
atom.workspace.getActiveTextEditor().insertText(m.replace(/<a[^>]*href="([^"]+)"/, function() {
return arguments[1] + "\n"
}))
})
})
})
"DOMオブジェクトにしてみる"の整形
require("http").get("http://b.hatena.ne.jp/ctop/it", function(r) {
var b = "";
r.on("data", function(c) {
b += c
});
r.on("end", function() {
var p = new DOMParser();
var d = p.parseFromString(b, "text/html");
[].forEach.call(d.querySelectorAll("a"), function(a) {
atom.workspace.getActiveTextEditor().insertText(a.getAttribute("href") + "\n")
})
})
})