2016-12-23 5 views
0

Я хотел бы разобрать заголовки новостей и ссылки из нижеследующего RSS страницы:Синтаксический RSS новости не работает

http://www.londonstockexchange.com/exchange/CompanyNewsRSS.html?newsSource=RNS&companySymbol=LSE

Я попытался с помощью этого кода (но это не работает):

<?php 

$xml=("http://www.londonstockexchange.com/exchange/CompanyNewsRSS.html?newsSource=RNS&companySymbol=LSE"); 

$xmlDoc = new DOMDocument(); 
$xmlDoc->load($xml); 
$x=$xmlDoc->getElementsByTagName('item'); 

for ($i=0; $i<=5; $i++) { 
    $title=$x->item($i)->getElementsByTagName('title') 
    ->item(0)->childNodes->item(0)->nodeValue; 
    $link=$x->item($i)->getElementsByTagName('link') 
    ->item(0)->childNodes->item(0)->nodeValue; 

    echo $title; 
    echo $link; 

} 
?> 

Однако тот же код работает, чтобы получить RSS заголовки и ссылки с других страниц RSS .. например:

<?php 

$xml=("https://feeds.finance.yahoo.com/rss/2.0/headline?s=bcm.v&region=US&lang=en-US"); 

$xmlDoc = new DOMDocument(); 
$xmlDoc->load($xml); 
$x=$xmlDoc->getElementsByTagName('item'); 

for ($i=0; $i<=5; $i++) { 
    $title=$x->item($i)->getElementsByTagName('title') 
    ->item(0)->childNodes->item(0)->nodeValue; 
    $link=$x->item($i)->getElementsByTagName('link') 
    ->item(0)->childNodes->item(0)->nodeValue; 

    echo $title; 
    echo $link; 

} 
?> 

Есть ли у вас какие-либо идеи о том, как заставить его работать?

Заранее благодарен!

+0

Я предлагаю вам написать ошибку вы получаете так кто-то может помочь вам найти решение. – Fer

ответ

1

Загрузка удаленных документов

проблема в том, что вы пытаетесь загрузить удаленный документ с помощью DOMDocument::load. Метод способен загружать удаленные файлы, но он не устанавливает HTTP-заголовок User-Agent, если он не указан через установку INI user_agent. Некоторые хосты настроены на отклонение HTTP-запросов, если заголовок User-Agent отсутствует. И URL-адрес, который вы вставили в вопрос, возвращает 403 Forbidden, если заголовок отсутствует.

Таким образом, вы должны либо установить агент пользователя через настройку INI:

ini_set('user_agent', 'MyCrawler/1.0'); 
$url = 'http://www.londonstockexchange.com/exchange/CompanyNewsRSS.html?newsSource=RNS&companySymbol=LSE'; 
$doc = new DOMDocument(); 
$doc->load($url); 

или загрузить документ вручную с User-Agent набором заголовков, например:

$url = 'http://www.londonstockexchange.com/exchange/CompanyNewsRSS.html?newsSource=RNS&companySymbol=LSE'; 
$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_USERAGENT, 'MyCrawler/1.0'); 
$xml = curl_exec($ch); 

$doc = new DOMDocument(); 
$doc->loadXML($xml); 

пересекающего DOM

Следующим проблема с вашим кодом заключается в том, что вы полностью полагаетесь на конкретную структуру DOM:

for ($i=0; $i<=5; $i++) { 
    $title=$x->item($i)->getElementsByTagName('title') 
    ->item(0)->childNodes->item(0)->nodeValue; 

Есть много возможных случаев, когда код не работает должным образом: менее 5 элементов, отсутствующих элементов, пустой документ и т. Д. Кроме того, код не очень читабельен. Вы всегда должны проверить, если узел существует, прежде чем глубже в ее структуру, например:

$channels = $doc->getElementsByTagName('channel'); 
foreach ($channels as $channel) { 
    // Print channel properties 
    foreach ($channel->childNodes as $child) { 
    if ($child->nodeType !== XML_ELEMENT_NODE) { 
     continue; 
    } 
    switch ($child->nodeName) { 
     case 'title': 
     echo "Title: ", $child->nodeValue, PHP_EOL; 
     break; 
     case 'description': 
     echo "Description: ", $child->nodeValue, PHP_EOL; 
     break; 
    } 
    } 
} 

Вы можете разобрать item элементы подобным же образом:

$items = $channel->getElementsByTagName('item'); 
foreach ($items as $item) { 
    // ... 
} 
+0

Вы также можете установить пользовательский агент в контексте потока libxml. [libxml_set_streams_context()] (http://de.php.net/manual/en/function.libxml-set-streams-context.php) – ThW

+0

Спасибо Руслан! Ваш ответ был просто прекрасен, несмотря на мой не очень ясный вопрос. Благодарю выделение !!! – Tim

1

Они имеют безопасность в месте, когда ни один агент пользователя не установлен, так что вы должны будете использовать локон и поддельный агента пользователя, чтобы получить содержимое XML, например:

$url = "http://www.londonstockexchange.com/exchange/CompanyNewsRSS.html?newsSource=RNS&companySymbol=LSE"; 
$agent= 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)'; 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_VERBOSE, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_USERAGENT, $agent); 
curl_setopt($ch, CURLOPT_URL,$url); 
$xml = curl_exec($ch); 
Смежные вопросы