Help us understand the problem. What is going on with this article?

Atomで手動スクレイピング

More than 3 years have passed since last update.

プログラムいらず!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")
    })
  })
})
from_kyushu
Vimmerですが諸事情でAtomにも手を出すことになったので、暫くはAtom,Node.js,CoffeeScript関連の投稿を中心に行います。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away