使用 Data::Printer 检查该提要中的 $item 对象表明,这些对象知道 media:group 和 media: 命名空间中的其他内容。
use strict;
use warnings;
use Data::Printer;
use XML::FeedPP;
my $feed = XML::FeedPP->new("https://www.youtube.com/feeds/videos.xml?channel_id=UCzJuUAme9EABE1quatA8z-Q");
foreach my $item ( $feed->get_item() ) {
p $item;
}
__END__
XML::FeedPP::Atom::Atom10::Entry {
Parents XML::FeedPP::Atom::Common::Entry
public methods (6) : category, description, get_pubDate_native, link, pubDate, title
private methods (0)
internals: {
author {
name "Fun to Origami",
uri "http://www.youtube.com/channel/UCzJuUAme9EABE1quatA8z-Q"
},
id "yt:video:332UeGpfY3E",
link {
-href "http://www.youtube.com/watch?v=332UeGpfY3E",
-rel "alternate"
},
media:group {
media:community {
media:starRating {
-average 4.56,
-count 9,
-max 5,
-min 1
},
media:statistics {
-views 940
}
},
media:content {
-height 390,
-type "application/x-shockwave-flash",
-url "https://www.youtube.com/v/332UeGpfY3E?version=3",
-width 640
},
media:description "...",
media:thumbnail {
-height 360,
-url "https://i4.ytimg.com/vi/332UeGpfY3E/hqdefault.jpg",
-width 480
},
media:title "Origami Pteranodon : Paper Dinosaur Tutorial"
},
published "2015-02-20T01:22:36+00:00",
title "Origami Pteranodon : Paper Dinosaur Tutorial",
updated "2016-02-15T13:42:07+00:00",
yt:channelId "UCzJuUAme9EABE1quatA8z-Q",
yt:videoId "332UeGpfY3E"
}
}
来源:Youtube,Omission mine
所以最明显的方法是直接访问数据结构。当然你不想这样做,因为它的风格很糟糕,而且底层实现可能会改变。
foreach my $item ( $feed->get_item() ) {
say $item->{'media:group'}->{'media:content'}->{'-height'};
}
__END__
390
...
如果这是一个运行一次后忘记的脚本,请在此处停止。
现在有趣的部分开始了。 $item 是 XML::FeedPP::Atom::Atom10::Entry,这是 XML::FeedPP::Item,这是 XML::FeedPP::Element。那家伙has a method get。看起来处理: 部分不会有问题,但它返回undef.
这个模块似乎经过了广泛的测试。有一个 11_media.t 实际上与 media: 命名空间一起玩。然而,在那里的示例中,它不仅可能工作(或者我无法安装该模块),而且它也有点不同。 media: 元素不是很深。它只是一个带有属性的标签。
请随时从这一点进一步研究。