我尝试在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);
感谢您的帮助!
答案 0 :(得分: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
,并且Mojocast Episode 5
答案 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标签的子代,所以我只是通过使用标量上下文抓住第一个。