Ejemplo de un filtrador de noticias : fetching
Escrito el 22/October/2007 por juan_belon
Hoy aprenderemos cómo cargar una página web externa y "pelar" el contenido de la "patata" para quedarnos sólo con lo que nos interesa así como formatear el resultado.
Lo primero que necesitamos para realizar nuestro script es una URL objetivo y el fichero de caché donde se escribirá cada día,para ello declaramos las siguientes variables:
<?php
$f = ‘/ruta_completa_al_directorio_de_caché/granada.xml';
$url = "http://es.noticias.yahoo.com/rss/granada.xml";
?>
de forma que lo primero que haremos será comprobar si disponemos de tal fichero para descargarlo en caso de que no sea así:
___PHP___
if (!file_exists($f) //Existe el fichero?
|| (date("d/m/Y",filemtime($f))-date("d/m/Y"))<0) //si,existe, tiene más de un día?
{ //en tal caso lo borramos
@unlink($f); //Recordar que @ se pone para que no se disparen posibles errores
//damos por supuesto que tanto el directorio como el fichero tiene permisos de escritura
$contenido = file_get_contents($url);
$fp = fopen($f,'w');
fwrite($fp,$contenido);
fclose($fp);
}
___PHP___
Una vez dispuesto el contenido que queremos "maquillar" primero extrayéndole la información que necesitamos,leemos el fichero final en la misma variable por aquello de la eficiencia en espacio,reutilizando la misma variable (si es que se hubiera utilizado anteriormente):
<?php
$contenido = file_get_contents($f);
?>
Con el contenido en memoria empezamos a "recortar" el contenido que nos interesa:
___PHP___
preg_match_all('/<item>.*<\/item>/isU',$contenido,$noticias);
___/PHP___
con esta expresión regular obtenemos todos los items del canal RSS de forma que nos quedamos con las $noticias (un array), del contenido, ahora sólo tenemos que iterar entre dichos elementos para ir extrayendo los títulos,enlaces y html que tiene cada uno de los items…
___PHP___
echo ‘<ul>';
$n = sizeof($noticias[0]);
for ($i=0; $i<$n; $i++){
preg_match("/<title>.*<\/title>/isU",$noticias[0][$i],$titulo);
$titulo = str_replace(array("<title>","</title>"),"",$titulo[0]);
preg_match('/<guid (.*)>(.*)<\/guid>/isU',$noticias[0][$i],$enlace);
$enlace = preg_replace('(<guid isPermaLink="false">)',"",$enlace[0]);
$enlace = ‘<a href="http://es.noticias.yahoo.com'.
utf8_decode(str_replace("</guid>","",$enlace)).'">ver</a>';
preg_match('/<media:text type="html">(.*)<\/media:text>/isU',$noticias[0][$i],$html);
$html = (str_replace(array('<media:text type="html">','</media:text>'),"",$html[0]));
$titulo = utf8_decode(str_replace(array('<![CDATA[',']]>'),array(""),$titulo));
echo ‘<li>'.$titulo.'<br>'.$html.'<br>'.$enlace.'<br></li>
‘;
}
echo ‘</ul>';
___/PHP___
Ésto convierte todo el XML en un nuevo código HTML con una lista (<UL></UL>) de elementos con noticias y enlaces más una pequeña descripción en HTML.
Espero que os haya servido la explicación.
Saludos.