【问题标题】:How to get an attribut with HTML::TreeBuilder如何使用 HTML::TreeBuilder 获取属性
【发布时间】:2014-04-11 08:48:42
【问题描述】:

我尝试在 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);

感谢您的帮助!

【问题讨论】:

  • HTML 是什么样的?您是否收到任何错误或其他输出?
  • 您可以查看网站上的 HTML - 我没有收到任何错误...我没有收到任何回复
  • 该 URL 返回 301。请尝试访问该 URL。
  • 如果你使用 $data 而不是 @data 会发生什么。 $data 将移动它返回的 attr_get_i 数组中的第一个元素。

标签: html perl parsing custom-attributes


【解决方案1】:

另一种方法是使用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 有一个有用的 8 分钟介绍 UA 和 Dom 选择器

【讨论】:

  • 谢谢,这比 HTML::TreeBuilder 更简单、更直观。你的解释也帮了大忙。
【解决方案2】:

来了。您需要获取一个子元素,因为 attr_get_i 返回向上移动层次结构的属性。此外,在我使用的 DataDump 中,data-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);

div 是任意的,因为所有的 div 都是 body 标签的子标签,所以我只使用标量上下文来抓取第一个。

【讨论】:

  • 谢谢,现在我对 TreeBuilder 有了更好的理解 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-23
  • 1970-01-01
  • 2016-09-19
  • 2012-01-23
  • 2011-02-26
  • 2016-07-31
  • 1970-01-01
相关资源
最近更新 更多