2014-06-06 68 views
4

當用Mojo::DOM(或任何其他框架)解析網頁時,拉取可能相對或絕對的資源地址相當常見。有沒有一種快捷方式將這種資源地址轉換爲絕對URL?Mojo :: DOM快捷方式獲取資源的絕對URL?

以下mojo命令拉所有的樣式上mojolicio.us:

$ mojo get http://mojolicio.us "link[rel=stylesheet]" attr href 
/mojo/prettify/prettify-mojo-light.css 
/css/index.css 

而下面的腳本不相同,而且還採用了URI的資源轉化爲絕對URL。

use strict; 
use warnings; 

use Mojo::UserAgent; 
use URI; 

my $url = 'http://mojolicio.us'; 

my $ua = Mojo::UserAgent->new; 
my $dom = $ua->get($url)->res->dom; 

for my $csshref ($dom->find('link[rel=stylesheet]')->attr('href')->each) { 
    my $cssurl = URI->new($csshref)->abs($url); 
    print "$cssurl\n"; 
} 

輸出:

http://mojolicio.us/mojo/prettify/prettify-mojo-light.css 
http://mojolicio.us/css/index.css 

很顯然,在這方面相對URL應該使用加載DOM的URL取得絕對的。但是,我不知道如何獲取資源絕對URL,除了自己編寫代碼。

Mojo::URL #to_absMojolicious。但是,我不知道這是否會以某種方式與Mojo::DOM進行整合,並且本身會佔用比URI更多的代碼。

我的理想的解決辦法是,如果像下面分別從兩個腳本和命令行可能的,但尋找任何相關的見解使用魔解析:

mojo get http://mojolicio.us "link[rel=stylesheet]" attr href to_abs 

回答

1

我不知道你爲什麼認爲需要更多代碼才能使用Mojo::URL?在下面的示例中,我從事務中獲取實際的請求URL(可能有重定向,我允許),我稱其爲$base

然後,因爲$baseMojo::URL的一個實例,我可以用$base->new創建一個新實例。當然如果這看起來很神奇,你可以用Mojo::URL->new替換它。

use Mojo::Base -strict; 
use Mojo::UserAgent; 

my $url = 'http://mojolicio.us'; 

my $ua = Mojo::UserAgent->new->max_redirects(10); 
my $tx = $ua->get($url); 
my $base = $tx->req->url; 

$tx->res 
    ->dom 
    ->find('link[rel=stylesheet]') 
    ->map(sub{$base->new($_->{href})->to_abs($base)}) 
    ->each(sub{say});