2014-04-11 1 views
0

과 attribut하는 방법을 : 나는 HTML :: 요소 및 HTML :: 트리를 공부나는 Jamendo 사이트의 바디 태그 내부의 JSON을 추출하려고 HTML :: TreeBuilder

<body id="album-home" data-tracksMgr='{...}'> 

을 :: 검색 그러나 나는 행운이 없었다. 내가 나무를 버리면 data-tracksMgr가 보입니다.

use strict; 
use warnings; 
use HTML::TreeBuilder; 
use YAML::Any qw'DumpFile LoadFile'; 
my $url = 'http://www.jamendo.com/de/list/a116765'; 
my $tree = HTML::TreeBuilder->new_from_url($url); 
my @data = $tree->attr_get_i("data-tracksMgr"); 
DumpFile('test.yaml', @data); 

어떤 도움을 주셔서 감사합니다!

+0

무엇 HTML이 생겼에서 UA와 돔 선택에 도움이 팔분 소개가? 그리고 오류나 기타 출력을 얻습니까? – zachhilbert

+0

웹 사이트의 HTML을 볼 수 있습니다. 아무런 오류가 없습니다 ... 아무 것도 다시 얻을 수 없습니다. – Lebewesen

+0

해당 URL은 301을 반환합니다. 대신 해당 URL에 액세스 해보십시오. – PerC

답변

2

또 다른 방법은 Mojo::UserAgentMojo::DOM을 사용하여 웹 페이지를 가져 와서 속성을 검색하는 것입니다. 참고, 당신이 실제로 지정한 URL이 다른 위치로 리디렉션, 그래서 필요하다고 리디렉션을 따라 대답 :

그냥 HTML::TreeBuilder와 같은
use strict; 
use warnings; 

use Mojo::UserAgent; 
use YAML::Any qw(DumpFile LoadFile); 

my $url = 'http://www.jamendo.com/de/list/a116765'; 
#my $url = 'http://www.jamendo.com/de/list/a116765/after-the-rain'; # Redirects to this URL 

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

my $data = $dom->find('body')->attr('data-tracksmgr'); 

DumpFile('test.yaml', "$data"); 

, 모든 속성은 소문자입니다.

이러한 모듈은 모두 Mojolicious와 함께 설치 될 수 있으며, Mojocast Episode 5

+0

감사합니다. 쉽고 직관적 인 HTML :: TreeBuilder입니다. 당신의 Expanation도 많이 도움이되었습니다. – Lebewesen

1

여기 있습니다. attr_get_i는 계층 구조 위로 올라가는 속성을 반환하기 때문에 하위 요소를 가져와야합니다. 또한, 데이터 tracksMgr 그래서 그 속성을 검색 하시나요 모든 사업부의의 몸 태그의 아이들이 때문에 사업부는, 임의 M.

my $tree = HTML::TreeBuilder->new_from_url($url); 
my $div = $tree->find_by_tag_name('div'); 
my $data = $div->attr_get_i("data-tracksmgr"); 
DumpFile('test.yaml', $data); 

소문자를 요구, 내가 사용하는 DataDump의 모든 소문자로 변경되었습니다, 그래서 나는 스칼라 문맥을 사용하여 첫 번째 문장을 얻는다.

+0

감사합니다. 이제 TreeBuilder를 조금 더 잘 이해할 수 있습니다. :) – Lebewesen

관련 문제