我正在尝试解析youtube xml Feed并想要访问Feed中的某些媒体元素。
我可以访问 title 和 link 等基本元素,但访问 media:group 下的任何内容都会返回空字符串。
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() ) {
print $item->get("media:group") . "\n";
}
有关如何访问媒体:群组及其子元素的任何建议?
答案 0 :(得分:1)
使用Data :: Printer检查该Feed中的$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:
元素不是很深。它只是一个带有属性的标签。
从这一点开始,请随意进行研究。