September 13th, 2006

Create a feed from Google News on your website

Google News provides an RSS feed for all news items. It can be an excellent source of fresh content on your website. You can copy and paste the PHP code below to embed a feed of the latest Google News items related to the topic of your website.

Make sure you attribute the content in some way to Google, so that you're not violating their TOS.

set_time_limit(0);

$topic = "Business"; // change to the topic of your site
$file = "http://news.google.com/news?sourceid=navclient&ie=UTF-8&rls=GGLG,GGLG:2005-22,GGLG:en&q=".$topic."&output=rss";

$rss_channel = array();
$currently_writing = "";
$main = "";
$item_counter = 0;

function startElement($parser, $name, $attrs) {
        global $rss_channel, $currently_writing, $main;
        switch($name) {
             case "RSS":
             case "RDF:RDF":
             case "ITEMS":
                  $currently_writing = "";
                  break;
             case "CHANNEL":
                  $main = "CHANNEL";
                  break;
             case "IMAGE":
                  $main = "IMAGE";
                  $rss_channel["IMAGE"] = array();
                  break;
             case "ITEM":
                  $main = "ITEMS";
                  break;
             default:
                  $currently_writing = $name;
                  break;
        }
}

function endElement($parser, $name) {
        global $rss_channel, $currently_writing, $item_counter;
        $currently_writing = "";
        if ($name == "ITEM") {

             $item_counter++;
        }
}

function characterData($parser, $data) {
        global $rss_channel, $currently_writing, $main, $item_counter;
        if ($currently_writing != "") {
                switch($main) {
                        case "CHANNEL":
                                if (isset($rss_channel[$currently_writing])) {
                                        $rss_channel[$currently_writing] .= $data;
                                } else {
                                        $rss_channel[$currently_writing] = $data;
                                }
                                break;
                        case "IMAGE":
                                if (isset($rss_channel[$main][$currently_writing])) {
                                        $rss_channel[$main][$currently_writing] .= $data;
                                } else {
                                        $rss_channel[$main][$currently_writing] = $data;
                                }
                                break;
                        case "ITEMS":
                                if (isset($rss_channel[$main][$item_counter][$currently_writing])) {
                                        $rss_channel[$main][$item_counter][$currently_writing] .= $data;
                                } else {
                                        $rss_channel[$main][$item_counter][$currently_writing] = $data;
                                }
                                break;
                }
        }
}

$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");

if (!($fp = fopen($file, "r"))) {
        die("could not open XML input");
}

while ($data = fread($fp, 4096)) {
        if (!xml_parse($xml_parser, $data, feof($fp))) {
                die(sprintf("XML error: %s at line %d",
                                        xml_error_string(xml_get_error_code($xml_parser)),
                                        xml_get_current_line_number($xml_parser)));
        }
}

xml_parser_free($xml_parser);

// below is where you'll modify the default HTML output, and where you can limit the number of items to show from the feed

if (isset($rss_channel["ITEMS"])) {
        if (count($rss_channel["ITEMS"]) > 0) {
                for($i = 0;$i < count($rss_channel["ITEMS"]);$i++) {
                        if (isset($rss_channel["ITEMS"][$i]["LINK"])) {
                        print ("\n<div class=\"itemtitle\"><a href=\"" . "go.php?url=" . $rss_channel["ITEMS"][$i]["LINK"] . "\">" . $rss_channel["ITEMS"][$i]["TITLE"] . "</a></div>");
                        } else {
                        print ("\n<div class=\"itemtitle\">" . $rss_channel["ITEMS"][$i]["TITLE"] . "</div>");
                        }
                         print ("<div class=\"itemdescription\">" . $rss_channel["ITEMS"][$i]["DESCRIPTION"] . "</div><br />");                 }
        } else {
                print ("<b>There are no articles in this feed.</b>");
        }
}

Leave a reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word