Webスクレイピングや外部サイトのデータ取得において、PHPでHTMLを解析する機会は非常に多いものです。しかし、HTMLは構造が不完全であったり、大文字・小文字が混在していたりと、XMLのように単純には扱えないケースが多々あります。
本記事では、PHPの「DOMDocument」クラスと「DOMXPath」クラスを組み合わせ、実務レベルで頻出する「複雑なHTMLからのデータ抽出」をスマートに解決する方法を解説します。
基礎知識:DOMDocumentとXPathとは
PHPでHTMLを解析する際、正規表現を使うのはおすすめしません。HTMLの構造が少し変わるだけで壊れてしまうからです。代わりにDOMDocumentを使用します。これはHTMLをツリー構造としてメモリに展開する仕組みです。
そのツリー構造の中から、特定のノード(要素)を柔軟に検索するための言語がXPathです。「idがcontentである要素の中の、すべてのliタグ」といった指定が可能になります。
実装のポイント
HTML解析における最大の難関は「文字化け」と「構文エラー」です。
PHPのDOMDocumentはXMLベースで動作するため、HTML特有の特殊文字や文字コードの扱いに注意が必要です。
1. 文字コードの変換: `mb_convert_encoding($html, “HTML-ENTITIES”, ‘auto’)` を使い、文字参照形式へ変換することで文字化けを防止します。
2. エラー抑制: `loadHTML()` を実行する際、`@`演算子を付けて警告を抑制します。不完全なHTMLタグがあっても処理を続行させるためです。
3. XPathの活用: `DOMXPath`を利用して、要素名だけでなく、属性やテキスト内容に基づいた検索を行います。
サンプルプログラム
以下のコードは、idを指定して要素を取得し、その中の情報を抽出する実例です。
Sample Text
- A
- B