无法从RSS提要解析img src?

时间:2016-07-30 21:20:49

标签: php dom rss

我正在尝试基于此示例创建RSS阅读器:

http://www.w3schools.com/php/php_ajax_rss_reader.asp

具体来说,我正在尝试修改此示例,以便读者可以从任何给定的Web漫画RSS源访问和显示所有可用的漫画图像(以及其他任何内容)。我意识到可能有必要使代码至少有一点特定于站点,但我试图尽可能地使它成为通用的。目前,我已经修改了最初的示例,以生成一个显示给定RSS提要列表的所有漫画的阅读器。但是,它还显示我试图摆脱的其他不需要的文本信息。到目前为止,这是我的代码,其中包含一些特别给我带来麻烦的提要:

index.php文件:

<html>
<head>
    <script>
        function showRSS() 
        {
          if (window.XMLHttpRequest) 
          {
            // code for IE7+, Firefox, Chrome, Opera, Safari
            xmlhttp=new XMLHttpRequest();
          } else 
          {  // code for IE6, IE5
            xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
          }
          xmlhttp.onreadystatechange=function() 
          {
            if (xmlhttp.readyState==4 && xmlhttp.status==200) 
            {
              document.getElementById("rssOutput").innerHTML=xmlhttp.responseText;
            }
          }
          xmlhttp.open("GET","logger.php",true);
          xmlhttp.send();
        }
    </script>
</head>
<body onload="showRSS()">
    <div id="rssOutput"></div>
</body>
</html>

(非常肯定这个文件并没有错;我认为下一个问题会出现,尽管为了完整性我还包含了这个问题)

logger.php:

<?php

//function to get all comics from an rss feed
function getComics($xml)
{
    $xmlDoc = new DOMDocument();
    $xmlDoc->load($xml);

    $x=$xmlDoc->getElementsByTagName('item');
    foreach ($x as $x)
    {
      $comic_image=$x->getElementsByTagName('description')->item(0)->childNodes->item(0)->nodeValue;
      //output the comic
      echo ($comic_image . "</p>");
      echo ("<br>");
    }

}

//create array of all RSS feed URLs
$URLs =
[
    "SMBC" => "http://www.smbc-comics.com/rss.php", 
    "garfieldMinusGarfield" => "http://garfieldminusgarfield.net/rss",
    "babyBlues" => "http://www.comicsyndicate.org/Feed/Baby%20Blues",
];

//Loop through all RSS feeds
foreach ($URLs as $xml)
{
    getComics($xml);
}

?>

因为这种方法在漫画图像之间包含额外的文本(很多随机的SMBC内容,只有一些gMg的广告链接,以及婴儿蓝调的版权链接),我查看了RSS提要并得出结论问题在于它是包含图像源的描述标签,但也包括其他内容。接下来,我尝试修改getComics函数以直接扫描图像标记,而不是首先查找description标记。我将DOMDocument创建/加载和URL列表之间的部分替换为:

$images=$xmlDoc->getElementsByTagName('img');
    print_r($images);

    foreach ($images as $image)
    {
        //echo $image->item(0)->getAttribute('src');
        echo $image->item(0)->nodeValue;
        echo ("<br>");
    }

但显然getElementsByTagName没有拾取嵌入在description标签内的图像标签,因为我没有输出漫画图像,以及print_r语句的以下输出:

DOMNodeList Object ( [length] => 0 ) DOMNodeList Object ( [length] => 0 )

最后,我尝试了两种方法的组合,尝试在解析描述标记内容的代码中使用getElementsByTagNam(&#39; img&#39;)。我换了一行:

$comic_image=$x->getElementsByTagName('description')->item(0)->childNodes->item(0)->nodeValue;

使用:

$comic_image=$x->getElementsByTagName('description')->item(0)->getElementsByTagName('img');
      print_r($comic_image);

但这也没有找到任何结果,产生输出:

DOMNodeList Object ( [length] => 0 ) 

很抱歉这个很长的背景,但是我想知道是否有办法从给定的RSS源中解析出img src而没有我不想要的其他文本和链接?< / p>

非常感谢帮助

2 个答案:

答案 0 :(得分:0)

在内部,描述内容已转义,因此以下代码应该有效:

foreach ($x as $y) {
    $description = $y->getElementsByTagName('description')->item(0);
    $decoded_description = htmlspecialchars_decode($description->nodeValue);
    $description_xml = new DOMDocument();
    $description_xml->loadHTML($decoded_description);
    $comic_image = $description_xml->getElementsByTagName('img')->item(0)->getAttribute('src');

    //output the comic
    echo ($comic_image);
    echo ("<br>");
}

答案 1 :(得分:0)

以下是其他人阅读本论坛的参考资料,以下是我最终编写的代码。我只用一个调用getImageTag函数的getImageSrc函数替换了每个循环中的所有内容:

Navigation.ModalPopAsync()