rhacoのSimpleTagを試してみました
「PHPでHTMLをparseしたい」って書いたらrhaco(らこ)を紹介して頂いたので
試してみました。
ダウンロード先は下記のサイトから
rhaco.org
http://www.rhaco.org/
私が利用したのはrhaco_1_1_0.zip
で本来はフレームワークみたいなんですが、
必要なのはあくまでHTMLのparse部分なんでライブラリ的に使ってみる。
なので今回はsetup.phpは利用しないで展開して設置だけ。
下記の記事を参考に
rhaco – rhacoのSimpleTag
http://d.hatena.ne.jp/rhaco/20061207
bodyタグ配下のaタグの抽出。リンク抽出だったらSnoopy::fetchlinksを使えば簡単なんだけどあくまでも例って事で。
require_once("./tag/data/SimpleTag.php"); $html = file_get_contents("http://www.google.co.jp/webhp?hl=ja"); $tag = new SimpleTag(); $tag->set($html, "body"); $links = array(); foreach($tag->getIn("a") as $childTag){ $links[] = $childTag; } echo "".strip_tags(print_r($links, true))."";
結果(長いので最初のaタグだけ)
Array( [0] => SimpleTag Object ( [name] => a [value] => このページをカスタマイズする => このページをカスタマイズする [parameterList] => Array ( [href] => SimpleTagParameter Object ( [id] => href [value] => /url?sa=p&pref=ig&pval=3&q=http://www.google.co.jp/ig%3Fhl%3Dja&usg=__zzRfDx_8QtfWxWHbIBWfjMV_2H8= [name] => href ) ) [attributeList] => Array ( ) )ちゃんとaタグがSimpleTagオブジェクトとして返却されました。
これは便利。
気になったのは<a id=”hogehoge”>xxxx</a>だと
parameterListにidが入って
<a id=hogehoge>xxxx</a>だと
attributeListにidが入ってしまうとこ。
どっちもparameterListに入って欲しいな。
SimpleTagParser::parseParameterAttribute()で”と’で判断しているのでこうなっちゃうみたい。正しくないHTMLをどこまで補完するかってとこになると思うんだけど対応して欲しいな~
時間作ってフレームワークの検証もしてみたいと思います。
haltさんご紹介ありがとうございます。
正しくないHTMLの可能性がある場合は
$tag->set($html, "body");
の時に
$tag->set($html, "body", true);
とすると正規化を図りますので、これで利用してみてください。
tokushimaさんコメントありがとうございます。
$tag->set($html, "body", true);で試してみました。
結果
parameterListにidが入りましたがaタグの件数が変わってしまいました。
はやり正確に抜き出すのは難しいのでしょうか。
上の例をやってみたところ、aタグの件数はどちらも(trueにしたのも)14件だったのですが、どんな感じになるのでしょうか?
再度試したいのですが諸事情で動かせません。報告は来週あたりになりそうです。
せっかく返信頂いたのに申し訳ありません。