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で実装されました