在使用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
显然,使用加载DOM的URL,应该在此上下文中使用相对URL。但是,除了自己编写代码之外,我不知道获取资源绝对URL的方法。
Mojolicious
中有Mojo::URL #to_abs
。但是,我不知道这是否会以某种方式与Mojo::DOM
集成,而且本身会占用比URI
更多的代码。
我理想的解决方案是,如果可以从脚本和命令行中获得以下内容,但寻找使用Mojo进行解析的任何相关见解:
mojo get http://mojolicio.us "link[rel=stylesheet]" attr href to_abs
答案 0 :(得分:1)
我不确定为什么您认为使用Mojo::URL
需要更多代码?在下面的示例中,我从事务中获取实际的请求URL(可能存在重定向,我已经允许),我称之为$base
。
然后,由于$base
是Mojo::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});