Translate

2009年6月29日月曜日

SPIDERING HACKS(#14)

#14は、相対URLを絶対URLに直しちゃうってお話ですね。
どうやら、URIモジュールのnew_absってメソッドに
相対URLとBaseURLを渡すと絶対URLを返してくれますよん。
ってことなんだって。

じゃ、BaseURLをどうしてゲットすりゃいいのかって話になると
LWP::UserAgentオブジェクトでgetとかpostした後でbaseメソッドで
取り出せるんですね。

ここいらの話を使ってコードを書いてみるとこんな感じ。
#!/usr/bin/perl#!/usr/bin/perl                                                                                     
use strict;
use warnings;
use URI;
use LWP;

#適当に階層の深そうなアドレスを用意してみる。
my $uri = URI->new('http://search.cpan.org/~gaas/URI-1.38/URI.pm');
my $UA = LWP::UserAgent->new();
my $response = $UA->get($uri);

#下記相対URLを絶対URLに直してみる。
my @list = qw(./1.html ./../2.html ./../../3.html ./hoge/0.html);

for my $list (@list){
print URI->new_abs($list, $response->base), "\n";
}


実行してみるとこうなる。
http://search.cpan.org/~gaas/URI-1.38/1.html
http://search.cpan.org/~gaas/2.html
http://search.cpan.org/3.html
http://search.cpan.org/~gaas/URI-1.38/hoge/0.html


なるほろね。
おまけ。
URIモジュールといえば、アドレスを分解するのに
非常に便利いいのでここにのっけておく。。
#!/usr/bin/perl#!/usr/bin/perl                                                                                     
use strict;
use warnings;
use URI;

my $u = URI->new('http://www.cpan.org/authors/00whois.html#hogehoge');

print "scheme:", $u->scheme, "\n";
print "opaque:", $u->opaque, "\n";
print "path:", $u->path, "\n";
print "frag:", $u->fragment, "\n";
print "host:", $u->host, "\n";


実行結果は
scheme:http
opaque://www.cpan.org/authors/00whois.html
path:/authors/00whois.html
frag:hogehoge
host:www.cpan.org

0 件のコメント: