如何使用HTML :: TreeBuilder获取属性

时间:2014-04-11 08:48:42

标签: html perl parsing custom-attributes

我尝试在Jamendo网站的正文标记中提取JSon:

<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);

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

另一种方法是使用Mojo::UserAgentMojo::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,并且Mojocast Episode 5

对UA和Dom选择器进行了8分钟的介绍。

答案 1 :(得分: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标签的子代,所以我只是通过使用标量上下文抓住第一个。