RSS Парсер как спарсить атрибуты тега enclosure

Тема в разделе "PHP", создана пользователем alex-bot, 21 окт 2010.

Модераторы: latteo
  1. alex-bot

    alex-bot Nulled-Man

    Регистр.:
    4 май 2007
    Сообщения:
    498
    Симпатии:
    144
    В общем имеем такую ленту:
    Код:
    <item>
    <title>Уголовные наказания в России станут мягче</title>
    <link>http://newsland.ru/News/Detail/id/575217/</link>
    <description><![CDATA[<p>По новому законопроекту,  применять...</p><img border="0" src="http://newsland.ru/public/upload/news/575217.jpg" width="100" alt="">]]></description>
    <author>МУСТАФА</author>
    <guid>http://newsland.ru/News/Detail/id/575217/</guid>
    <pubDate>Thu, 21 Oct 2010 16:24:02 +0400</pubDate>
    <enclosure url="http://newsland.ru/public/upload/news/575217.jpg" length="" type="image/jpeg" />
    </item>
    
    И имеем вот такой старенький парсер под ПХП 4
    PHP:
    <?php
    $itemNum
    =0;
    class 
    RSSParser {
    var 
    $channel_title="";
    var 
    $channel_website="";
    var 
    $channel_description="";
    var 
    $channel_pubDate="";
    var 
    $channel_lastUpdated="";
    var 
    $channel_copyright="";
    var 
    $title="";
    var 
    $link="";
    var 
    $description="";
    var 
    $pubDate="";
    var 
    $author="";
    var 
    $url="";
    var 
    $width="";
    var 
    $height="";
    var 
    $inside_tag=false;
    function 
    RSSParser($file,$encType) {
    $this->xml_parser xml_parser_create($encType);
    xml_set_object$this->xml_parser, &$this );
    xml_set_element_handler$this->xml_parser"startElement""endElement" );
    xml_set_character_data_handler$this->xml_parser"characterData" );
    $fp = @fopen("$file","r") or die( "$file could not be opened" );
    while (
    $data fread($fp4096)){xml_parse$this->xml_parser$datafeof($fp)) or die( "XML error");}
    fclose($fp);
    xml_parser_free$this->xml_parser );
    }

    function 
    startElement($parser,$tag,$attributes=''){
    $this->current_tag=$tag;
    if(
    $this->current_tag=="ITEM" || $this->current_tag=="IMAGE"){
    $this->inside_tag=true;
    $this->description="";
    $this->link="";
    $this->title="";
    $this->pubDate="";
    }
    }

    function 
    endElement($parser$tag){
    switch(
    $tag){
    case 
    "ITEM":
    $this->titles[]=trim($this->title);
    $this->links[]=trim($this->link);
    $this->descriptions[]=trim($this->description);
    $this->pubDates[]=trim($this->pubDate);
    $this->authors[]=trim($this->author);
    $this->author=""$this->inside_tag=false;
    break;
    case 
    "IMAGE":
    $this->channel_image="<img src=\"".trim($this->url)."\" width=\"".trim($this->width)."\" height=\"".trim($this->height)."\" alt=\"".trim($this->title)."\" border=\"0\" title=\"".trim($this->title)."\" />";
    $this->title=""$this->inside_tag=false;
    default:
    break;
    }
    }

    function 
    characterData($parser,$data){
    if(
    $this->inside_tag){
    switch(
    $this->current_tag){
    case 
    "TITLE":
    $this->title.=$data; break;
    case 
    "DESCRIPTION":
    $this->description.=$data; break;
    case 
    "LINK":
    $this->link.=$data; break;
    case 
    "URL":
    $this->url.=$data; break;
    case 
    "WIDTH":
    $this->width.=$data; break;
    case 
    "HEIGHT":
    $this->height.=$data; break;
    case 
    "PUBDATE":
    $this->pubDate.=$data; break;
    case 
    "AUTHOR":
    $this->author.=$data; break;
    default: break;
    }
    //end switch
    }else{
    switch(
    $this->current_tag){
    case 
    "DESCRIPTION":
    $this->channel_description.=$data; break;
    case 
    "TITLE":
    $this->channel_title.=$data; break;
    case 
    "LINK":
    $this->channel_website.=$data; break;
    case 
    "COPYRIGHT":
    $this->channel_copyright.=$data; break;
    case 
    "PUBDATE":
    $this->channel_pubDate.=$data; break;
    case 
    "LASTBUILDDATE":
    $this->channel_lastUpdated.=$data; break;
    default:
    break;
    }
    }
    }
    }

    $forex1 = new RSSParser("http://www.newsland.ru/rss/getnews/ord/1/cat/0","utf-8");
    ?>

    <table width="100%" border="0" class="tab">
    <?php
    $forex1_RSSmax
    =50;
    if(
    $forex1_RSSmax==|| $forex1_RSSmax>count($forex1->titles))$forex1_RSSmax=count($forex1->titles);
    for(
    $itemNum=0;$itemNum<$forex1_RSSmax;$itemNum++) {?><tr>
    <td align="left" bgcolor="" ><b style="font-size:12px"><?php
    $title
    =$forex1->titles[$itemNum];
    echo 
    iconv("UTF-8","windows-1251"$title )
    ?></b></td>
    </tr>
    <tr>
    <td align="left" ><?php
    $descr
    =$forex1->descriptions[$itemNum];
    echo 
    iconv("UTF-8","windows-1251"$descr )
    ?>
    <div class="file"><noindex><a href=" <?php echo $forex1->links[$itemNum]; ?> "target="_blank" <?php echo $forex1->links[$itemNum]; ?>" rel=nofollow>Читать целиком</a><br><br></noindex></div></td>
    </tr>
    <?php ?>
    </table> 
    Можете подсказать как в него дописать возможность парсить урл
    <enclosure url="http://newsland.ru/public/upload/news/575217.jpg"
    Сам как не пробовал не выходит..., да и примера толком нормального не нашел или под ПХП5 видно... С этим вроде разобрался так нормально парсит...
     
  2. pitkina

    pitkina

    Регистр.:
    1 апр 2007
    Сообщения:
    253
    Симпатии:
    176
    намного проще реализация с simplexml
    только вместо изображения из enclosure сервер отдает 404

    PHP:
    <table width="100%" border="0" class="tab">
    <?
    $xml = simplexml_load_file('http://www.newsland.ru/rss/getnews/ord/1/cat/0');
    $xml2 = $xml->children()->channel;

    for($i=0;$i<count($xml2->item);$i++):
    $title = iconv('UTF-8','windows-1251//IGNORE',$xml2->item->$i->title);
    $desc = iconv('UTF-8','windows-1251//IGNORE',$xml2->item->$i->description);
    $link = $xml2->item->$i->link;

    $img_arr = (array) $xml2->item->$i->enclosure;
    $img = $img_arr['@attributes']['url']; // enclosure
    ?>
    <tr><td align="left" bgcolor="" ><b style="font-size:12px"><?=$title?></b></td></tr>
    <tr><td align="left" ><?=$desc?><div class="file"><noindex><a href="<?=$link?>" target="_blank" rel="nofollow">Читать целиком</a><br><br></noindex></div></td></tr>
    <tr><td><img src="<?=$img?>" /></td></tr>
    <? endfor; ?></table>
     
    alex-bot нравится это.
  3. karapet

    karapet

    Регистр.:
    9 сен 2008
    Сообщения:
    168
    Симпатии:
    104
    если я правильно понял и нужны только урл картинок, то тогда можно вот так:
    PHP:
    $sources file_get_contents('http://newsland.ru/exp/rss/getnews/ord/22/');
    preg_match_all('|<enclosure url="(.*)" length="" type="image/jpeg" />|sUS'$sources$output_contentPREG_PATTERN_ORDER);
    echo 
    '<pre>';
    print_r($output_content[1]);
    echo 
    '<pre>';
     
    alex-bot нравится это.
  4. alex-bot

    alex-bot Nulled-Man

    Регистр.:
    4 май 2007
    Сообщения:
    498
    Симпатии:
    144
    Достал меня этот парсер сколько времени убил :( , просто почти все стоит на старом Денвере с ПХП 4 поэтому и парсер туда хотел до кучи, наверно завтра на 5-й поставлю и там с simplexml сделаю, думаю там попроще будет, да и примеры попадались...
    karapet
    Да можно и так, но я начал один делать на регулярках, и тоже куча ошибок, пока отложил...
    ЗЫ Если бы сразу 2 денвера запускалось :)
    Да действительно, а на кой тогда постят если не дают их... видать это я на другом сайте еще смотрел и там проверил, с картинками все в порядке было...
     
  5. karapet

    karapet

    Регистр.:
    9 сен 2008
    Сообщения:
    168
    Симпатии:
    104
    советую про php4 забыть:) сам сталкивался с такой проблемой. была у меня одна cms написанная на четверке.. носился с ней как с писанной торбой. потом плюнул, поставил одновременно php4 и php5, переписал все моменты которые не работали и забыл про четверку.
    а насчет картинок, можно вот так(код кривоватый, но работает и думаю идея понятна:))

    PHP:
    $sources file_get_contents('http://newsland.ru/exp/rss/getnews/ord/22/');
    preg_match_all('|<enclosure url="(.*)" length="" type="image/jpeg" />|sUS'$sources$output_contentPREG_PATTERN_ORDER);
    foreach(
    $output_content[1] as $url) {
        if(
    stristr($url'.jpg')) preg_match_all('|/news/(.*).jpg|sUS'$url$output_contentPREG_PATTERN_ORDER);
        elseif(
    stristr($url'.gif')) preg_match_all('|/news/(.*).gif|sUS'$url$output_contentPREG_PATTERN_ORDER);
        
    $number_image $output_content[1][0];
        
    $kod substr($number_image03);
        
    $good_url str_replace('/news/''/news_images/'.$kod.'/big_'$url);
        echo 
    '<img src="'.$good_url.'"><br /><br />';
    }
     
    alex-bot нравится это.
  6. frantz1488

    frantz1488

    Регистр.:
    21 мар 2010
    Сообщения:
    162
    Симпатии:
    43
    Полностью согласен хоть в пятой версии и повыбрасывали многое его легко можно заменить, кому надо вот линк:
    Перейти по ссылке
    А по поводу регулярок они удобны для парсинга html, а в xml занимают очень много времени.
     
  7. user99

    user99 Постоялец

    Регистр.:
    13 янв 2008
    Сообщения:
    128
    Симпатии:
    13
    $content = file_get_contents('http://cbr.ru/scripts/XML_daily.asp');
    $xml = simplexml_load_string($content);

    $date = ($xml['@attributes']['date']);
    echo "$date"; Не работает.

    $date = ($xml->@attributes->date); Так тоже ошибка.

    Как взять значение Date отсюда? Спасибо :)
     
  8. bugargen

    bugargen

    Регистр.:
    24 апр 2008
    Сообщения:
    232
    Симпатии:
    19
    Так и взять :)
    PHP:
    $xml = array
        (
            
    'attributes' => array
                (
                    
    'date' => 'Hello WORLD!'
                
    )
        );

    echo 
    $xml['attributes']['date'];
    А для наглядности, при работе с массивами, можешь вместо простого echo использовать:
    PHP:
    echo '<pre>' print_r $xml) . '</pre>';
     
  9. user99

    user99 Постоялец

    Регистр.:
    13 янв 2008
    Сообщения:
    128
    Симпатии:
    13
    Спасибо за вариант, но так не получается с Перейти по ссылке, получить там проблема заключается именно в @attributes из за собчки, а вот другие значения отлично проходят.
     
  10. outbox

    outbox Создатель

    Регистр.:
    5 фев 2008
    Сообщения:
    28
    Симпатии:
    9
    если кому еще надо, я нашел способ так вытаскиывать аттрибут из enclosure
    PHP:
      $xml simplexml_load_file('rss.xml');
      foreach (
    $xml->channel->item as $item) {
        echo 
    $item->title."\n";
        echo 
    $item->description."\n";
        echo 
    $item->pubDate."\n";
        echo 
    $item->link."\n";
        echo 
    $item->enclosure->attributes()->url."\n";
      }