aswww log

エンジニアの技術録。アプリとかウェブとか

phpでhtmlをparseする方法まとめ

スクレイピングバッチにかかせないのがhtmlのparse。いくつか方法をためしたのでまとめて見る。

1)PDOMDocumentとかを駆使して連想配列化する方法
 取得するHTMLによれば、おそらく最も手間がかからない方法。 手順は以下のとおり。

・file_get_contents()でHTML取得
・DOMDocumentのloadHTML()を使用してHTMLをXMLへ整形
・simplexml_load_string()でSimpleXMLElementオブジェクトへ変換
・json_encode()でJSON化。更にjson_decode()してArray化。

ただ、loadHTML()時に一番上にXMLタグが無いだけで怒られるし、file_get_contents()の時点で文字コード変換したのに何か文字化け(?)で怒られたりして使用を断念。

参考:PHPでHTMLをパースして解析する簡単な方法

※ちなみにDOMDoccumentが使えるかどうか調べるためのソースは以下のとおり。

<?php
print_r(get_loaded_extensions());
print_r (get_extension_funcs ("DOM"));

参考
PHPでDOM のモジュールが使えません!

2)Simple HTML DOM Parserを使用する方法
 結構有名なライブラリ。HTML取得からオブジェクト化までをfile_get_html()でやってくれるスグレモノ。導入方法と使い方を以下のとおり。

・zipファイルをダウンロードし、"simple_html_dom.php"のみを任意のディレクトリにコピーする。
phpファイルにてrequire(任意のディレクトリ/simple_html_dom.php)する。
・file_get_html()を使用してHTMLがParseされたオブジェクトを取得する。
 ※simple_html_dom.phpは関数集なので直接関数を呼んでしまって良い。

あとは取得したオブジェクトに$html->find('a')とか$html->find('img', 0)->srcとかして情報を取得する。(jQueryチックな操作感)やや柔軟だが、やはりタグが閉じられてなかったりするとお手上げ。あと重い。でも人気。解説サイトもたくさんある。

参考
PHP Simple HTML DOM Parser Manual(本家?)
PHP Simple HTML DOM Parser
誰でもスクレイピング!DOM要素を引っこ抜くSimple HTML Dom

3)preg系関数で正規表現とかを用いて頑張ってParseする方法
 これが一番めんどくさくいけど一番柔軟で一番確実な方法。1)2)で紹介した方法を用いた場合でも最終的にはこれを併用することになるのではないかな。よっぽど整形されたHTML相手でなければ。やり方はHTMLソースとにらめっこしてほしい情報をpreg_split()やらpreg_replace()を用いて一個一個取得する感じです。

参考
PHP マニュアル


他にも触ってないけどphpQueryというライブラリが気になった。名前のとおりjQueryライクな感じで要素へアクセスできるらしい。時間あるときに試したい。

参考
スクレイピング応用編-phpQuery
スクレイピング用おすすめライブラリ『phpQuery』の基本的な使い方