Как получить аттрибут с HTML :: TreeBuilder

0

Я пытаюсь извлечь 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);

Спасибо за любую помощь!

  • 0
    Как выглядит HTML? И вы получаете какие-либо ошибки или другой вывод?
  • 0
    Вы можете посмотреть HTML-код на веб-сайте - я не получаю никакой ошибки ... Я ничего не получаю обратно
Показать ещё 2 комментария
Теги:
parsing
custom-attributes

2 ответа

2
Лучший ответ

Другой метод - использовать 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

  • 0
    Спасибо, это проще и интуитивнее, чем HTML :: TreeBuilder. Ваше Расширение также очень помогло.
1

Вот. Вам нужно получить вспомогательный элемент, так как 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, поэтому я просто захватываю первый, используя скалярный контекст.

  • 0
    спасибо, теперь я понимаю, TreeBuilder немного лучше :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню