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

Статус
В этой теме нельзя размещать новые ответы.

alex-bot

Nulled-Man
Регистрация
4 Май 2007
Сообщения
497
Реакции
161
В общем имеем такую ленту:
Код:
<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($fp, 4096)){xml_parse( $this->xml_parser, $data, feof($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==0 || $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 видно... С этим вроде разобрался так нормально парсит...
 
намного проще реализация с 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>
 
если я правильно понял и нужны только урл картинок, то тогда можно вот так:
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_content, PREG_PATTERN_ORDER);
echo '<pre>';
print_r($output_content[1]);
echo '<pre>';
 
Достал меня этот парсер сколько времени убил :( , просто почти все стоит на старом Денвере с ПХП 4 поэтому и парсер туда хотел до кучи, наверно завтра на 5-й поставлю и там с simplexml сделаю, думаю там попроще будет, да и примеры попадались...
karapet
Да можно и так, но я начал один делать на регулярках, и тоже куча ошибок, пока отложил...
ЗЫ Если бы сразу 2 денвера запускалось :)
только вместо изображения из enclosure сервер отдает 404
Да действительно, а на кой тогда постят если не дают их... видать это я на другом сайте еще смотрел и там проверил, с картинками все в порядке было...
 
советую про php4 забыть:) сам сталкивался с такой проблемой. была у меня одна cms написанная на четверке.. носился с ней как с писанной торбой. потом плюнул, поставил одновременно php4 и php5, переписал все моменты которые не работали и забыл про четверку.
а насчет картинок, можно вот так(код кривоватый, но работает и думаю идея понятна:))
 
советую про php4 забыть:) сам сталкивался с такой проблемой. была у меня одна cms написанная на четверке.. носился с ней как с писанной торбой. потом плюнул, поставил одновременно php4 и php5, переписал все моменты которые не работали и забыл про четверку.
Полностью согласен хоть в пятой версии и повыбрасывали многое его легко можно заменить, кому надо вот линк:
Для просмотра ссылки Войди или Зарегистрируйся
А по поводу регулярок они удобны для парсинга html, а в xml занимают очень много времени.
 
$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 отсюда? Спасибо :)
 
Как взять значение Date отсюда? Спасибо :)
Так и взять :)
PHP:
$xml = array
    (
        'attributes' => array
            (
                'date' => 'Hello WORLD!'
            )
    );

echo $xml['attributes']['date'];

А для наглядности, при работе с массивами, можешь вместо простого echo использовать:
PHP:
echo '<pre>' . print_r ( $xml, 1 ) . '</pre>';
 
Спасибо за вариант, но так не получается с , получить там проблема заключается именно в @attributes из за собчки, а вот другие значения отлично проходят.
 
если кому еще надо, я нашел способ так вытаскиывать аттрибут из 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";
  }
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху