2016-07-30 14 views
0

Ich versuche, einen RSS-Reader basiert auf dieses Beispiel zu erstellen:Problem Parsing nur img src aus RSS-Feed?

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

Insbesondere ich versucht bin, diesem Beispiel zu ändern, so dass der Leser zugreifen und alle verfügbaren Comic-Bilder angezeigt werden (und sonst nichts) aus einem beliebigen Webcomic-RSS-Feed. Mir ist klar, dass es notwendig sein kann, den Code zumindest ein wenig ortsspezifisch zu machen, aber ich versuche, ihn so allgemein wie möglich zu machen. Derzeit habe ich das erste Beispiel so geändert, dass ein Reader erstellt wurde, der alle Comics einer bestimmten Liste von RSS-Feeds anzeigt. Es werden jedoch auch andere unerwünschte Textinformationen angezeigt, die ich loswerden möchte. Hier ist mein Code so weit, mit einem paar Feeds, die mir Schwierigkeiten insbesondere geben:

Datei 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> 

(ziemlich sicher, dass es nichts falsch mit dieser Datei, ich denke, die Probleme entstehen, in den nächsten einem obwohl enthalten ich diese auf Vollständigkeit)

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); 
} 

?> 

Da dieses Verfahren beinhaltet zusätzlichen Text zwischen den komischen Bildern (al ein paar zufällige Sachen mit SMBC, nur ein paar Werbe-Links für gMg, und eine Urheberrechtsverknüpfung für Baby-Blues), sah ich mir die RSS-Feeds an und kam zu dem Schluss, dass es das Beschreibungs-Tag ist, das die Bildquelle enthält, aber auch beinhaltet andere Sachen. Als Nächstes habe ich versucht, die Funktion getComics zu modifizieren, um direkt nach dem Bild-Tag zu suchen, anstatt zuerst nach dem Beschreibungs-Tag zu suchen. Ich ersetzen den Teil zwischen der DOMDocument Erstellung/Laden und der URL-Liste mit:

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

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

aber anscheinend getElementsByTagName nicht den Bild-Tag in der Beschreibung Tag eingebettet holen, weil ich keine Comic-Bilder ausgegeben bekommen, und die folgende Ausgabe von der print_r Anweisung:

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

Schließlich habe ich versucht, eine Kombination der beiden Methoden versucht getElementsByTagNam (‚img‘) in den Code zu verwenden, die die Beschreibung Tag Inhalt analysiert werden. Ich ersetzen die Zeile:

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

mit:

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

Aber das findet auch nichts, das Ausgangssignal zu erzeugen:

DOMNodeList Object ([length] => 0) 

So sorry für den wirklich langen Hintergrund, aber ich bin frage mich, ob es eine Möglichkeit gibt, nur die img src aus einem bestimmten RSS-Feed ohne den anderen Text und Links, die ich nicht wollen, analysieren?

Hilfe würde viel

Antwort

0

intern geschätzt werden, Beschreibung Inhalt entkommen ist, so dass der folgende Code funktionieren sollte:

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>"); 
} 
+0

Danke, ich glaube, ich in der Regel bekommen, was Sie sagen, und ich versuchte, Ihren spezifischen Code aus. Es funktioniert für einige der Feeds, aber erzeugt einen seltsamen Fehler für andere von ihnen. Für SMBC beispielsweise druckt es 5 gültige Bild-URLs aus, gibt dann aber wiederholt den folgenden Fehler: Warnung: DOMDocument :: loadHTML(): htmlParseEntityRef: erwartet ';' in Entity, Zeile: 30 in C: \ xampp \ htdocs \ comic_database_logger \ logger.php in Zeile 30, worüber ich sehr verwirrt bin. Ich verstehe nicht, warum es ein Semikolon in einigen der Beschreibung Text – user2472083

+0

für Baby Blues erwartet, es funktioniert vollständig (obwohl es die URL des Bildes statt das Bild selbst ausgibt, was ich später lösen kann) ,, und für Garfield minus Garfield gibt es nur den oben aufgeführten Fehler. Sehr verwirrt – user2472083

+0

Eigentlich habe ich versucht, nur ein @ vor der Zeile ein Problem verursacht, weil sie nur Warnungen waren, und jetzt funktioniert alles perfekt, außer dass ich herausfinden muss, wie das Bild anstelle der Bildquelle Link angezeigt wird – user2472083

0

Für den Bezug von sonst jemand in diesem Forum zu lesen später, hier ist der Code, den ich endete mit.Ich ersetzen alles in der für jede Schleife mit nur einer getImageSrc Funktion, die eine getImageTag Funktion aufruft:

//function to find an image tag within a specific section if there is one 
function getImageTag ($item,$tagName) 
{ 
    //pull desired section from given item 
    $section = $item->getElementsByTagName($tagName)->item(0); 
    //reparse description as if it were a string, because for some reason PHP woon't let you directly go to the source image with getElementsByTagName 
    $decoded_section = htmlspecialchars_decode($section->nodeValue); 
    $section_xml = new DOMDocument(); 
    @$section_xml->loadHTML($decoded_section); //the @ is to suppress a bunch of warnings about characters this parser doesn't like 
    //pull image tag from section if there 
    $image_tag = $section_xml->getElementsByTagName('img')->item(0); 
    return $image_tag; 
} 

//function to get the image source URL from a given item 
function getImageSrc ($item) 
{ 
    $image_tag = getImageTag($item,'description'); 
    if (is_null($image_tag)) //if there was nothing with the tag name of image in the description section 
    { 
     //check in content:encoded section, because that's the next most likely place 
     $image_tag = getImageTag($item,'encoded'); 
     if (is_null($image_tag)) //if there was nothing with the tag name of image in the encoded content section 
     { 
      //if the program gets here, it's probably because the feed is crap and doesn't include images, 
      //or it's because this particular item doesn't have a comic image in it 
      $image_src = ''; 
      //THIS EXCEPTION WILL PROBABLY NEED TO BE HANDLED LATER TO AVOID POTENTIAL ERRORS 
     } else 
     { 
      $image_src = $image_tag->getAttribute('src'); 
     } 
    } else 
    { 
     $image_src = $image_tag->getAttribute('src'); 
    } 
    return $image_src; 
}