2014-06-06 2 views
4

Mojo::DOM (또는 다른 프레임 워크)으로 웹 페이지를 구문 분석 할 때 상대적이거나 절대적인 리소스 주소를 가져 오는 것이 일반적입니다. 이러한 리소스 주소를 절대 URL로 변환하는 바로 가기 방법이 있습니까?Mojo :: 리소스에 대한 절대 URL을 가져 오는 DOM 단축키?

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

을 그리고 다음 스크립트 역시 동일하지만, 또한 절대 URL로 리소스를 번역 URI을 사용

mojo 다음 명령을 mojolicio.us에있는 모든 스타일 시트를 당기는.

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을 얻는 방법을 모르겠습니다.

Mojolicious입니다. 그러나, 나는 그것이 어떤 식 으로든 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}); 
관련 문제