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);
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');
参考
- DOMDocumentクラスのマニュアルトップページ
PHP: DOMDocument – Manual - 取得したDOM要素に対する操作
PHP: DOMElement – Manual - childNodes とか firstChild とか previousSibling とか
PHP: DOMNode – Manual
Pingback: AKIBE - PHP4でHTMLをパースする
firegoby » Blog Archive » PHP5のDOM拡張モジュールでHTMLをパースする: http://bit.ly/aVc5ge
This comment was originally posted onTwitter