Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

tokuhirom's Blog

HTML::TreeBuilder のメソッドを覚えるには人生はみじかすぎる件について

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 さんが書いてくれるとおもうので割愛します。