scraper コマンドの LibXML 対応 & UserAgent 切り替え対応パッチ
先のエントリで HTML::TreeBuilder::LibXML を紹介しましたが、HTML::TreeBuilder::XPath と、LibXML は下記のように微妙に挙動が違うので、Web::Scraper 付属の scraper コマンドも LibXML を使うように変更しました。
HTML::TreeBuilder::LibXML を使うと、こう書けない a[@href=~"http"] 代わりにこう書く a[starts-with(@href,"http")]
また、User Agent によって振り分けてるページも多いので、それも scraper コマンドで対応できるように、第二引数で User Agent 文字列を指定できるようにしました。パッチは以下です。
--- /usr/bin/scraper 2009-03-25 14:33:52.000000000 +0900 +++ /usr/bin/scraper.new 2009-03-25 14:35:18.000000000 +0900 @@ -13,4 +13,7 @@ use Web::Scraper; use YAML; +use LWP::UserAgent; +use HTML::TreeBuilder::LibXML; +HTML::TreeBuilder::LibXML->replace_original(); sub WARN() { @@ -36,7 +38,9 @@ my $stuff = process_args($ARGV[0]) or die "Usage: scraper [URI-or-filename]\n"; +my $ua = LWP::UserAgent->new('agent' => $ARGV[1]); my $term = Term::ReadLine->new("Web::Scraper"); my $scraper = scraper { run_loop($_[0], $term) }; + $scraper->user_agent($ua); $scraper->user_agent->env_proxy;
ただし、HTML::TreeBuilder::LibXML には as_HTML() メソッドが無いので、HTML のソースを見ようと思って、s コマンドを打つと、
Can't locate object method "as_HTML" via package "HTML::TreeBuilder::LibXML" at /usr/bin/scraper line 77.
と、怒られますのでご注意。
0.01_03で実装されました