【问题标题】:XML::FeedPP and accessing media:* propertyXML::FeedPP 和访问媒体:* 属性
【发布时间】:2016-02-19 03:42:02
【问题描述】:

我正在尝试解析 youtube xml 提要并希望访问提要中的某些 媒体 元素。

我可以访问 titlelink 等基本元素,但访问 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";
}

关于如何访问 media:group 及其子元素的任何建议?

【问题讨论】:

  • 您无需使用反斜杠转义 ?=
  • 谢谢。我是从 shell 复制/粘贴的,它似乎已经自动逃脱了。

标签: perl xml-parsing


【解决方案1】:

使用 Data::Printer 检查该提要中的 $item 对象表明,这些对象知道 media:groupmedia: 命名空间中的其他内容。

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
...

如果这是一个运行一次后忘记的脚本,请在此处停止。


现在有趣的部分开始了。 $itemXML::FeedPP::Atom::Atom10::Entry,这是 XML::FeedPP::Item,这是 XML::FeedPP::Element。那家伙has a method get。看起来处理: 部分不会有问题,但它返回undef.

这个模块似乎经过了广泛的测试。有一个 11_media.t 实际上与 media: 命名空间一起玩。然而,在那里的示例中,它不仅可能工作(或者我无法安装该模块),而且它也有点不同。 media: 元素不是很深。它只是一个带有属性的标签。

请随时从这一点进一步研究。

【讨论】:

  • 您是正确的通过hash 访问元素是要走的路。我确实查看了底层类,它似乎在内部传递了一个命名空间对象,我怀疑 youtube 提供的命名空间是这里的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-25
  • 1970-01-01
相关资源
最近更新 更多