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オブジェクトはルートノードなので使う必要はない。