Я пытаюсь извлечь JSon внутри тела Tag на сайте Jamendo:
<body id="album-home" data-tracksMgr='{...}'>
Я изучил HTML :: Element и HTML :: Tree :: Scanning, но мне не повезло. Если я сбрасываю дерево, я вижу 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);
Спасибо за любую помощь!
Другой метод - использовать Mojo::UserAgent
и Mojo::DOM
для получения веб-страницы и получения атрибута. Обратите внимание, что указатель, который вы указали, фактически перенаправляет в другое место, поэтому необходимо сказать, чтобы следовать переадресации:
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");
Как и с HTML::TreeBuilder
, все атрибуты строчные.
Оба этих модуля могут быть установлены с Mojolicious
и есть полезное 8-минутное введение в селектор UA и Dom в Mojocast Episode 5
Вот. Вам нужно получить вспомогательный элемент, так как attr_get_i возвращает атрибуты, перемещающие иерархию. Кроме того, data-tracksMgr был изменен на все строчные буквы в DataDump, который я использовал, поэтому для поиска этого атрибута требуется нижний регистр 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);
Div произволен, так как все div являются дочерними элементами тега body, поэтому я просто захватываю первый, используя скалярный контекст.