スペースモラトリアムノカミサマ

日記+コメント付きブックマーク+他人にも役に立つかもしれない情報など。
(更新情報: RSS(ツッコミ付き) / RSS(ツッコミ抜き) / LIRS)

最近の TrackBack:
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|06|07|08|09|10|
2011|01|02|03|07|10|11|
2012|02|03|04|07|08|09|
2013|01|06|07|
2014|02|08|09|11|
2015|09|
2016|01|05|
2017|07|
2018|05|07|
2019|07|
2020|08|09|10|12|
2021|05|
2022|03|

2006/10/04

_ [Perl] HTML::TreeBuilder イイ

HTML の解析処理にはこれまで HTML::Parser とか HTML::TokeParser とか使ってきましたが、どちらもどうにもまどろっこしくてイライラしてました。

で、Perl で CSS セレクタ@naoyaのはてなダイアリーや HTML::Selector::XPath をリリース@blog.bulknews.net 等で HTML::TreeBuilder が使われているのを見て使ってみましたが、DOM っぽく操作できてかなりいい感じです。

とりあえず、指定した URL から HTML をゲットして画像の ALT 属性を展開しつつ全ての A 要素のリンクテキストと URL を表示するテスト

use strict;
use HTML::TreeBuilder;
use LWP::Simple;
use URI;
 
# 引数
die 'usage: foobar.pl URL' if ($#ARGV != 0);
my $url = $ARGV[0];
 
# HTML Tree 作成
my $tree = new HTML::TreeBuilder;
$tree->parse(get($url));
 
# alt 属性を持つ要素はそのテキストで置換する
for my $img ($tree->look_down('alt', qr/.*/)) {
  $img->replace_with($img->attr_get_i('alt'));
}
 
# 全ての A 要素のテキストと URL と絶対化した URL を取り出す
for my $a ($tree->find('a')) {
  print join("\t",
             $a->as_text,
             $a->attr_get_i('href'),
             URI->new_abs($a->attr_get_i('href'), $url)
        ), "\n";
}

use HTML::TreeBuilder@hPod あたりも参考になりました。

というわけでさよなら HTML::TokeParser。