jsdom
ブラウザなしでHTMLを「 DOM 」として扱えるようにするツールです。
jsdom をインストールするには、以下のようにします。
npm i jsdom
文字列の HTML をスクレイピングするには、以下のようにします。
const { JSDOM } = require('jsdom');
const body = `<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>タイトル</title>
</head>
<body>
<img id="hoge" src="sample1.jpg" alt="">
<img src="img.png">
</body>
</html>`
const dom = new JSDOM(body);
dom.window.document.querySelectorAll("img").forEach((a) => {
console.log(a.src)
})
jsdom と Puppeteer の違い
特徴 / 項目 | jsdom (JSDOM) | Puppeteer (パペティア) |
---|---|---|
種類 | Node.jsライブラリ | Node.jsライブラリ |
目的 | Node.js上でブラウザのDOM環境をエミュレートする | 実際のChromium/Chromeブラウザをプログラムから制御する |
基盤 | 純粋なJavaScriptで書かれたDOM実装 | Chrome DevTools Protocol を介した実際のブラウザ操作 |
実行環境 | Node.jsプロセス内 | 実際のブラウザプロセスを起動(ヘッドレスまたはGUIあり) |
重さ/速度 | 軽量で高速 | 比較的重く、起動に時間がかかる |
レンダリング | HTML/CSSのレンダリングは行わない (DOMツリーの構築のみ) |
実際のブラウザが完全なレンダリングを行う (CSS適用、画像表示など) |
JavaScript実行 | HTML内の<script> タグのJSを実行可能(ただし、完全なブラウザAPIは利用不可) |
実際のブラウザのJavaScriptエンジンで実行 (全てのブラウザAPIが利用可能) |
ネットワーク | 基本的にネットワークリクエストをエミュレートしない(設定で一部可能) | 実際のブラウザがネットワークリクエストを行う (画像、CSS、JSの読み込みなど) |
ユーザー操作のシミュレーション | できない | 可能(クリック、入力、スクロール、ホバーなど) |
用途 |
|
|
得意なこと |
|
|
苦手なこと |
|
|
node-html-parser
node-html-parser のインストールするには、以下のようにします。
npm i node-html-parser
文字列の HTML をスクレイピングするには、以下のようにします。
var HTMLParser = require('node-html-parser');
const body = `<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>認証した場合のみ画像表示</title>
</head>
<body>
<img id="hoge" src="before_sample.jpg" alt="">
<img src="img.png">
</body>
</html>`
const dom = HTMLParser.parse(body);
dom.querySelectorAll("img").forEach((a) => {
a.setAttribute('src', 'after_sample.png')
})
// 変更後のHTMLを取得
console.log(dom.toString())