PHP5のDOM拡張モジュールでHTMLをパースする

PHP5で追加されたDOM拡張モジュールではHTMLのパースも可能である。
さらに、このDOM拡張モジュールは標準でインストールされている。

今回の記事では、このDOMDocumentクラスについてのおぼえがき。

ちなみに、DOMが苦手な人は”要素”とか”属性”を理解できずに、まとめてタグとしてしか理解出来ていないひとが多い気がする。

HTMLを読み込む

まずはじめに、DOMDocument オブジェクトを生成する。

$doc = new DOMDocument();

そのあとで、HTMLを読み込む。
以下のようにloadHTML()などを使用すると閉じタグのないHTMLでもパース可能になる。

$doc->loadHTML('<html></html>'); // HTMLソースを読み込む
$doc->loadHTMLFile('/path/to/index.html'); // HTMLファイルを読み込む

DOM拡張モジュールによるHTMLの読み込みには上記のように2種類の方法が用意されており、HTMLファイルを読み込む方法は、http:// からはじまるURLでも指定可能である。

2011/03/04 追記

HTMLを読み込む際に、上記の処理では文字化けするサイトがあることがわかった。
以下のような処理を行えば解消した。

$html = file_get_contents('/path/to/index.html');
$html = mb_convert_encoding($html, 'HTML-ENTITIES', 'auto');
$dom->loadHTML($html);

参考: 2008-05-30 – hamacoの日記

HTMLをパースするために実際の処理

HTMLパースの流れはJavaScript等のDOM操作と同じなので、わかるひとにはすぐにわかると思う。

HTML内の全てのA要素を取得する。

$elements = $doc->getElementsByTagName('a');

ちなみに、パラメータで指定する要素名(上記の例ではa)は、大文字小文字を区別するようなので注意。

取得した要素がいくつあるかを取得する。

以下のような感じ。

$elements->length

取り出した全ての $elements のhref 属性を出力する。

foreach ($element as $e) {
    print $e->getAttribute('href');
}

これも大文字小文字を区別するのかな?

取り出した全ての $elements のノード値を取得する。

<a>~</a> で囲まれた部分を取得するには。

foreach ($element as $e) {
    print $e->nodeValue;
}

取り出した $elements の n 番目の属性値を取得する。

取得した最初のa要素の href 属性を取得するには?

$elements->item(0)->getAttribute('href');

参考