HTML::TreeBuilder
HTMLを解析してツリー構造のオブジェクトを生成する
use HTML::TreeBuilder;
パッケージをロードする。
my $tree = HTML::TreeBuilder->new_from_file($file);
HTMLファイルからインスタンスを生成する。
my $tree = HTML::TreeBuilder->new_from_content($html);
スカラー変数に保存されたHTMLからインスタンスを生成する。
他に、空のインスタンスを生成してparseメソッドを使う手順もあるが、面倒なだけなので使わない。
HTML::TreeBuilderは、HTML::Elementの派生クラスになっており、インスタンス生成後の検索などはHTML::Elementのメソッドを使う。HTML::TreeBuilderのツリー構造のルートを意味するオブジェクトで、HTML::TreeBuilderでルート配下の子ノード(HTML::Element)をたどって検索・解析する、という仕組みになっている。
同じ構造のHTMLを繰り返し解析するような、全体のツリー構造が既知の場合には極めて容易にHTMLから文字列やリンクURLを抽出できる。全体の構造が未知のHTMLを解析する場合は、HTML::Parser という選択肢もある。また、下記の注意事項のように、コメントはオブジェクト化されないので、特徴的なコメントを目印にしてHTML解析ができるような場合は、往々にして正規表現で解析した方が手っ取り早い。
使用例:HTMLタイトルを表示する
use HTML::TreeBuilder;
my $tree = HTML::TreeBuilder->new_from_content($content);
my $html_title = $tree->find('title'); # HTML::Elementのメソッド
print $html_title->as_text,"\n";
注意事項)コメントとDOCTYPE宣言はツリー構造には組み込まれず、無視される(HTML::Elementは、これらを疑似タグとみなしてオブジェクト化する機 能があるようなので、HTML::TreeBuilder側のHTMLパース上の都合と思われる)。従って、HTML::TreeBuilderでHTMLをオブジェクト化して、as_HTMLメソッドでHTMLに戻しても同じHTMLには戻らない。
$tree->delete();
HTML::Elementのメソッド。親ノードからの繋がりを切断してインスタンスを空にする。
子だけが削除されると木構造が壊れるのでHTML::Elementオブジェクトを削除する場合はこのメソッドを呼べ、という趣旨の説明があるが、HTML::TreeBuilderオブジェクトはルートノードなので使う必要はない。