2011-12-29 1 views
2

Этот код отлично работает с любым другим rss-каналом, но не с новостями Google. Я не знаю, что я делаю неправильно, я думаю, что это ошибка. я получаю эту ошибку, когда я пытаюсь читать новости Google каналовsimplepie не разобрал google news rss feed

This XML document is invalid, likely due to invalid characters. XML error: SYSTEM or PUBLIC, the URI is missing at line 1, column 61

Например, если попробовать http://stackoverflow.com/feeds каналы он работает хорошо, но не с новостями Google каналы. Может ли кто-нибудь дать мне подсказку?

<?php 

    //get the simplepie library 
    require_once('simplepie.inc'); 

    //grab the feed 
    $feed = new SimplePie(); 

    $feed->set_feed_url("http://news.google.com/news?hl=en&gl=us&q=austria&ie=UTF-8&output=rss"); 
    $feed->force_feed(true); 
    //$feed->encode_instead_of_strip(true); 


    //enable caching 
    $feed->enable_cache(true); 

    //provide the caching folder 
    $feed->set_cache_location('cache'); 

    //set the amount of seconds you want to cache the feed 
    $feed->set_cache_duration(1800); 

    //init the process 
    $feed->init(); 

    //let simplepie handle the content type (atom, RSS...) 
    $feed->handle_content_type(); 

?> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
    <title>simple</title> 
</head> 

<body> 
<div id="page-wrap"> 

    <h1>News Finder</h1> 

    <?php if ($feed->error): ?> 
     <p><?php echo $feed->error; ?></p> 
    <?php endif; ?> 

    <?php foreach ($feed->get_items() as $item): ?> 

     <div class="chunk"> 

      <h4 style="background:url(<?php $feed = $item->get_feed(); echo $feed->get_favicon(); ?>) no-repeat; text-indent: 25px; margin: 0 0 10px;"><a href="<?php echo $item->get_permalink(); ?>"><?php echo $item->get_title(); ?></a></h4> 

      <p class="footnote">Source: <a href="<?php $feed = $item->get_feed(); echo $feed->get_permalink(); ?>"><?php $feed = $item->get_feed(); echo $feed->get_title(); ?></a> | <?php echo $item->get_date('j M Y | g:i a T'); ?></p> 



     </div> 

    <?php endforeach; ?> 


</div> 

+1

Я считаю, что нашел проблему. Это проблема с моей хостинговой компанией [Rackspace]. Когда я попробовал это на другой учетной записи хостинга у меня с другой компанией, она работала как шарм. Спасибо @ Ryan за то, что он пришел и помог. Позаботьтесь – acrobat

+1

У меня почти такая же проблема. Не могли бы вы рассказать мне, что именно было с вашим хозяином? –

+0

Да, пожалуйста, сообщите нам, что проблема вашего хоста? – PinoyStackOverflower

ответ

4

Убедитесь, что вы используете SimplePie 1.2.1, 1,2 была ошибка с URL разбором, который может вызвать этот тип ошибки.

(я также ведущий разработчик SimplePie, так что не стесняйтесь снимать вопросы прямо на мой адрес электронной почты)

Если вы используете 1.2.1, то окажется, что это проявление bug #162, которая в настоящее время неподтвержденными. Я рассмотрю этот вопрос, но, похоже, это ошибка в SimplePie, а не в коде.

(я также разместить назад здесь с тем, почему это происходит для любопытных среди вас.)

+0

Большое спасибо за помощь, я использую 1.2.1, загруженный сегодня. Это код, который у меня есть для каждого фида, такого как 'stackoverflow.com/feed' и т. Д., За исключением новостных лент google. Я озадачен. – acrobat

1

Я не имею ни малейшего понятия о SimplePie, однако, простой способ в вашем случае может быть только SimpleXML:

$url = "http://news.google.com/news?hl=en&gl=us&q=austria&bav=on.2,or.r_gc.r_pw.,cf.osb&biw=1920&bih=973&um=1&ie=UTF-8&output=rss"; 
$feed = simplexml_load_file($url); 

echo $feed->channel->title, "\n<", $feed->channel->link, ">\n\n"; 

foreach($feed->channel->item as $item) 
{ 
    echo "* $item->title\n <$item->link>\n"; 
} 

SimpleXML, как правило, доступны непосредственно с PHP, вам не нужно устанавливать какую-либо библиотеку.

Demo

+0

спасибо hakre, я попробовал свой скрипт на своем сервере и, похоже, не работает. Есть ли какое-то требование? – acrobat

+0

SimpleXML в порядке, если вы знаете, что канал будет соответствовать RSS/Atom. Проблема в том, что большинство фидов в Интернете этого не делают. SimplePie - это, по сути, слой нормализации на SimpleXML. –

+0

@ Ryan McCue: SimpleXML не так сильно фокусируется на фидах, как это делает SimplePie, поэтому на самом деле это не альтернатива, он просто работал на Feed. – hakre

0

Для Google Лента новостей использует:

$feed->set_raw_data(file_get_contents($rssurl)); 
0

Просто хотел, чтобы добавить примечание здесь для других что думаю, что вышеприведенный ответ не работает. Если вы получаете нулевое значение в заголовке элемента, проверьте источник подачи, это может быть не что-то неправильное с вашим simplepie или скриптом, но ваш браузер устанавливает его в null из-за HTML-кода в тегах элемента заголовка.

+0

«выше ответа» не имеет смысла, поскольку ответы могут быть отсортированы по дате, по голосам или по активности. Пожалуйста, используйте ссылку на ответ или используйте имя автора ответа. – Moritz