2012-02-14 3 views
1

Photobucket에서 RSS 피드를 읽고 구문 분석하려고하는데 요소의 하위 요소를 얻는 데 어려움을 겪고 있습니다. 다음은 샘플 RSS XML입니다.Perl을 사용하여 Photobucket RSS 피드를 파싱 하시겠습니까?

<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/"> 
    <channel> 
     <title>BlahBlah&apos;s Photobucket websitePic album media</title> 
     <description>A feed of BlahBlah&apos;s images and videos for this album</description> 
     <pubDate>Sun, 7 Aug 2011 20:11:31 MDT</pubDate> 
     <link>http://s1100.photobucket.com/albums/g409/BlahBlah/websitePic/?sort=ascending</link> 

     <lastBuildDate>Mon, 13 Feb 2012 21:04:43 MST</lastBuildDate> 
     <generator>Photobucket feed generator</generator> 
     <language>en-us</language> 
     <ttl>60</ttl> 
     <item> 
      <title>F1 sidecar</title> 

      <link>http://s1100.photobucket.com/albums/g409/BlahBlah/websitePic/?action=view&amp;current=IMG_0673.jpg&amp;sort=ascending</link> 
      <dc:creator>BlahBlah</dc:creator> 
      <description>&lt;p&gt;&lt;a href=&quot;http://s1100.photobucket.com/albums/g409/BlahBlah/&quot;&gt;BlahBlah&lt;/a&gt; posted a photo&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://s1100.photobucket.com/albums/g409/BlahBlah/websitePic/?action=view&amp;current=IMG_0673.jpg&amp;sort=ascending&quot; title=&quot;IMG_0673.jpg&quot;&gt;&lt;img src=&quot;http://i1100.photobucket.com/albums/g409/BlahBlah/websitePic/th_IMG_0673.jpg&quot; alt=&quot;IMG_0673.jpg&quot; /&gt;&lt;/a&gt;&lt;br&gt;F1 sidecar - IMG_0673.jpg&lt;/p&gt;</description> 

      <guid>http://i1100.photobucket.com/albums/g409/BlahBlah/websitePic/IMG_0673.jpg</guid> 
      <enclosure type="image/jpeg" url="http://i1100.photobucket.com/albums/g409/BlahBlah/websitePic/IMG_0673.jpg" /> 
      <media:content medium="image" type="image/jpeg" url="http://i1100.photobucket.com/albums/g409/BlahBlah/websitePic/IMG_0673.jpg"> 
       <media:title>F1 car</media:title> 
       <media:description /> 
       <media:thumbnail url="http://i1100.photobucket.com/albums/g409/BlahBlah/websitePic/th_IMG_0673.jpg" /> 
      </media:content> 
      <pubDate>Sun, 7 Aug 2011 20:11:31 MDT</pubDate> 

     </item> 

나는 그 가치를 얻기 위해 요소에 가고 싶습니다. 여기

use strict; 
use CGI; 
use XML::RSS; 
use LWP::Simple; 

my $test = CGI->new; 
my $url = "http://feed1100.photobucket.com/albums/g409/BlahBlah/websitePic/feed.rss"; 

my $rss = XML::RSS->new(); 
my $data = get($url); 
$rss->parse($data); 

$rss->add_module(prefix=>'media', uri=>'http://search.yahoo.com/mrss/'); 

print $test->header("text/html"); 

my $channel = $rss->{channel}; 

foreach my $item (@{ $rss->{items} }) 
{ 
    my $link = $item->{link}; 
    my $title = $item->{title}; 
    my $thumb = ''; 

    foreach my $b ({ $item->{'http://search.yahoo.com/mrss/'}->{'content'} }) 
    { 
     print "here\n"; 
     if($b->{'http://search.yahoo.com/mrss/'}->{'thumbnail'}->{'url'}) 
     { 
      $thumb = $thumb . ' ' . $b->{'http://search.yahoo.com/mrss/'}->{'thumbnail'}->{'url'}; 
     } 
    } 

    print $title, "\n", $link, "\nthumb=", $thumb, "\n\n\n"; 
} 

print $test->end_html; 

이 반복됩니다 모든 채널 항목의를 통해 작동하지 않습니다 내 코드는 ..., 그리고 요소를 찾을 수 있습니다,하지만 난 자식 요소를 얻을 수없는 것. 제 문법은 가깝다고 생각합니다. 아이디어?

답변

1

items 것은이 구조에 구문 분석됩니다 : 예를 들어 내가 "http://search.yahoo.com/mrss/"에서 어떤 "thumbnail" 키가 표시되지

items => [ 
    { 
    dc => { 
     creator => "BlahBlah" 
    }, 
    description => "<p><a href=\"http://s1100.photobucket.com/albums/g409/BlahBlah/\">BlahBlah</a> posted a photo</a></p><p><a href=\"http://s1100.photobucket.com/albums/g409/BlahBlah/websitePic/?action=view&current=IMG_0673.jpg&sort=ascending\" title=\"IMG_0673.jpg\"><img src=\"http://i1100.photobucket.com/albums/g409/BlahBlah/websitePic/th_IMG_0673.jpg\" alt=\"IMG_0673.jpg\" /></a><br>F1 sidecar - IMG_0673.jpg</p>", 
    enclosure => { 
     type => "image/jpeg", 
     url => "http://i1100.photobucket.com/albums/g409/BlahBlah/websitePic/IMG_0673.jpg" 
    }, 
    guid => "http://i1100.photobucket.com/albums/g409/BlahBlah/websitePic/IMG_0673.jpg", 
    "http://purl.org/dc/elements/1.1/" => { 
     creator => "BlahBlah" 
    }, 
    "http://search.yahoo.com/mrss/" => { 
     content => "\n    ...", 
     title => "F1 car" 
    }, 
    isPermaLink => "", 
    item => "\n   \n\n ...", 
    link => "http://s1100.photobucket.com/albums/g409/BlahBlah/websitePic/?action=view&current=IMG_0673.jpg&sort=ascending", 
    pubDate => "Sun, 7 Aug 2011 20:11:31 MDT", 
    title => "F1 sidecar" 
    } 
], 

. 데이터가 어떻게 보이는지 정확하게 보려면 데이터를 덤프하는 것이 좋습니다. 이를 위해서는 Data::Dump 같은 모듈을보십시오.

+0

이것은 내가 원하는 요소이며 요소의 'url'속성이 필요합니다. 하지만 고마워, 나는 데이터 덤프를 시도 할 것이다. – MonkeyWrench

0

이이 줄에 오타과 같습니다

foreach my $b ({ $item->{'http://search.yahoo.com/mrss/'}->{'content'} }) 

내가 처음의 앞에 "@"를 놓치고 생각 "{"가. 귀하의 예제에서

+0

내가 다음과 같은 오류 메시지가 나타나는 경우 "strict refs"사용 중에 문자열 (" "...)을 ARRAY ref로 사용할 수 없습니다. – MonkeyWrench

+0

잘 모르겠습니다. XML :: RSS에서 사용하는 네임 스페이스 구문을 다루는 "즐거움"을 본 적이 없다고 생각합니다. 하지만, '$ item-> {'http://search.yahoo.com/mrss/ '} -> {'content '}'는 반복자가 될 수있는 것이 아닙니다. 다른 방법을 찾아야합니다. "데이터 사용 :: Dumper; Dumper ($ item);을 삽입하는 것이 좋습니다." 당신의 foreach 바로 위에 실제로 무엇이 있는지를 말해 줄 것입니다. 모든 게시물에 media : content 태그가있는 것은 아닙니다.이 경우 먼저 해당 태그를 감지해야합니다. – zostay

관련 문제