JavaScriptでHTML解析
JavaScriptでHTML文字列を解析する
JavaScriptでHTMLを扱う基礎知識
- DOM (Document Object Model)
HTML文書をツリー構造で表現したモデルです。JavaScriptからDOMを操作することで、HTML要素の追加、変更、削除などが可能になります。 - HTML (HyperText Markup Language)
ウェブページの構造や内容を定義するための言語です。
HTML文字列を解析する方法
- innerHTML プロパティ
- HTML要素の内部のHTMLコードを取得または設定します。
- DOMParser オブジェクト
- より柔軟な解析と操作を行うためのオブジェクトです。
具体的な例: HTML文字列から情報を抽出する
const htmlString = '<div><p>Hello, world!</p><p>This is another paragraph.</p></div>';
// innerHTMLを使用
const divElement = document.createElement('div');
divElement.innerHTML = htmlString;
const paragraphs = divElement.getElementsByTagName('p');
for (let i = 0; i < paragraphs.length; i++) {
console.log(paragraphs[i].textContent);
}
// DOMParserを使用
const parser = new DOMParser();
const doc = parser.parseFromString(htmlString, 'text/html');
const paragraphs2 = doc.querySelectorAll('p');
paragraphs2.forEach(paragraph => {
console.log(paragraph.textContent);
});
注意点
- パフォーマンス
大量のHTMLを解析する場合、DOMParser
のパフォーマンスが優れていることがあります。 - セキュリティリスク
ユーザーから提供されたHTML文字列を直接DOMに挿入すると、クロスサイトスクリプティング (XSS) の脆弱性につながる可能性があります。信頼できないソースからのHTMLを処理する場合は、適切なサニタイズ処理が必要です。
コード例1: innerHTML
プロパティを使用
const htmlString = '<p>This is a paragraph.</p>';
const element = document.createElement('div');
element.innerHTML = htmlString;
- element.innerHTML = htmlString
htmlString
の HTMLコードをdiv
要素の内部に設定します。 - document.createElement('div')
div
要素を作成します。
コード例2: DOMParser
オブジェクトを使用
const parser = new DOMParser();
const doc = parser.parseFromString(htmlString, 'text/html');
const paragraph = doc.querySelector('p');
- doc.querySelector('p')
p
要素を取得します。 - parser.parseFromString(htmlString, 'text/html')
htmlString
を HTML文書として解析し、Document
オブジェクトを返します。 - new DOMParser()
DOMParser
オブジェクトを作成します。
const htmlString = '<div><p>Hello, world!</p><p>This is another paragraph.</p></div>';
// innerHTMLを使用
const divElement = document.createElement('div');
divElement.innerHTML = htmlString;
const paragraphs = divElement.getElementsByTagName('p');
for (let i = 0; i < paragraphs.length; i++) {
console.log(paragraphs[i].textContent);
}
// DOMParserを使用
const parser = new DOMParser();
const doc = parser.parseFromString(htmlString, 'text/html');
const paragraphs2 = doc.querySelectorAll('p');
paragraphs2.forEach(paragraph => {
console.log(paragraph.textContent);
});
- forEach
ノードリストの各要素に対して処理を実行します。 - querySelectorAll('p')
p
要素のノードリストを取得します。 - textContent
要素のテキスト内容を取得します。 - getElementsByTagName('p')
p
要素の配列を取得します。
正規表現 (Regular Expressions)
- 例
const htmlString = '<p>This is a paragraph.</p>'; const regex = /<p>(.*?)<\/p>/; const match = htmlString.match(regex); if (match) { console.log(match[1]); // "This is a paragraph." }
- 欠点
HTMLの複雑な構造を正確に表現するには困難な場合があります。 - 利点
シンプルで高速なパターンマッチングが可能。
DOMParserの代替ライブラリ
- 例
- jsdom
const jsdom = require('jsdom'); const { JSDOM } = jsdom; const dom = new JSDOM(htmlString); const document = dom.window.document; const paragraphs = document.querySelectorAll('p');
- cheerio
const cheerio = require('cheerio'); const $ = cheerio.load(htmlString); const paragraphs = $('p');
- jsdom
- 欠点
依存性が増えるため、プロジェクトの複雑性が増す可能性があります。 - 利点
より高度な機能やパフォーマンスを提供する場合があります。
サーバーサイドのHTML解析
- 例
- 欠点
サーバー側での処理が必要となるため、アーキテクチャが複雑になる場合があります。 - 利点
サーバー側で処理することで、クライアント側の負荷を軽減できます。
javascript html dom