blog.monophile.net

Takaaki Yamamoto

東京工業大学において計算機科学と応用数学を学び、情報科学芸術大学院大学[IAMAS]においてメディア表現を専攻し修了。 現在は digitiminimi Inc. において、インフラエンジニアとして生計をたててている。 また、計算を主題に制作を行い、現代音楽作品や公共インスタレーション作品など技術提供を行う。 三輪眞弘に師事する。

List

nodejsで簡単なDOM処理

いきさつ

Webページの再構築中で、HTMLファイルの分割をしています。 最初はPythonでやっていたのですが、やっぱりWebから生まれたjavascriptで処理するのが適切かと思いnodejsでやってみました。

HTMLファイルの分割

標準入力からHTMLを表すテキストファイルを読み込み、div要素をid.txtというファイル名で書き出します。 なお、行頭の空白文字を削除する処理も行っています。

install

nodejsとnpmをMacPortsからインストールし、npmでjsdomをインストールします。

$ sudo port install nodejs npm
$ npm install jsdom

code.js

var fs = require('fs');
var jsdom = require('jsdom').jsdom;

var stdin = fs.readFileSync('/dev/stdin', 'utf8');
var document = jsdom(stdin);
var divs = document.getElementsByTagName("div");
for (var i = 0; i < divs.length; i++) {
    var d = divs[i];
    var id = d.getAttribute("id");
    var filename = id + ".txt"
    var output = d.innerHTML.replace(/^\s*/gm,"")
    fs.writeFile(filename, output)
}

input.html

<html>
<body>
    <div id="00">
        <h1>title00</h1>
        <p>paragraph00.</p>
    </div>
    <div id="01">
        <h1>title01</h1>
        <p>paragraph01.</p>
    </div>
    <div id="02">
        <h1>title02</h1>
        <p>paragraph02.</p>
    </div>
</body>
</html>

exec

実行は次のコマンドで。

$ cat input.html | nodejs code.js

ちゃんとファイルに分割できました。 ### 00.txt

<h1>title00</h1>
<p>paragraph00.</p>

01.txt

<h1>title01</h1>
<p>paragraph01.</p>

02.txt

<h1>title02</h1>
<p>paragraph02.</p>