HTML::TreeBuilder の ->lookup だの ->find だのを覚えるのは、学習の効率がよくない。つぶしがきかないので、もっと一般的な CSS Selector や XPath などを覚えて、それをつかった方がお得であるといえる。
HTML::TreeBuilder で XPath を利用するには、HTML::TreeBuilder::XPath をインストールすればよく、これは pure perl なので容易に利用できる。
my $tree = HTML::TreeBuilder::XPath->new; $tree->parse($content); my @items = $tree->findnodes(q{//*[@id='topicsfb']//li}); print $_->as_text."\n" for @items;
とすればよい。
XPath はむずかしい、とかんじるような人(一般に XPath は XML の専門家以外にはむずかしすぎるし、使用頻度もすくないから覚えてもすぐわすれてしまう)は CSS selector を使うとよい。CSS selector は、web site を構築する上では覚えざるをえない技術なので、君たちはすでにしっているからだ。
Tatsuhiko Miyagawa の HTML::Selector::XPath をつかえば、
use HTML::Selector::XPath 'selector_to_xpath'; print selector_to_xpath('#topicsfb li'), "\n"; # => //*[@id='topicsfb']//li
のように、簡単に CSS Selector から XPath を生成することができる。
これを利用し、
use HTML::TreeBuilder::XPath; use HTML::Selector::XPath 'selector_to_xpath'; my $tree = HTML::TreeBuilder::XPath->new; $tree->parse($content); my @items = $tree->findnodes(selector_to_xpath('#topicsfb li')); print $_->as_text."\n" for @items;
とするとよい。
ここで、Web::Scraper というモジュールをつかうと、一連の流れを全部まとめてやってくれるのだが、そのあたりの話は id:sfujiwara さんが書いてくれるとおもうので割愛します。