[Apis] Html Agility Pack

Estoy iniciando un proyecto personal, portadas del Perú, cuyo fin es mostrar las portadas de los diarios locales, bajo cierta perspectiva. Hay diarios, por ejemplo elcomercio.pe, donde no hay problema en obtener la imagen de portada: http://e.elcomercio.pe/66/impresa/img/2010/05/10/ecpr100510a1.jpg, claro considerando una determinada hora de publicación. Es fácil identificar que el patrón de la imagen sólo esta determinado por la fecha del día, fácil de determinar con un juego de Strings:

   1:  

   2: String.Format("http://e.elcomercio.pe/66/impresa/img/{0}/ecpr{1}a1.jpg",

   3:               DateTime.Now.ToString("yyyy/MM/dd"), DateTime.Now.ToString("ddMMyy"));

   4: //

Pero otros (varios), como Perú21.pe, donde la imagen de portada tiene un atributo adicional: http://e.peru21.pe/102/impresa/img/2010/05/10/234399.jpg. Además de tener la fecha, tiene un número que imagino debe ser el ID de la imagen, podemos probar http://e.peru21.pe/102/impresa/img/2010/05/10/234400.jpg y http://e.peru21.pe/102/impresa/img/2010/05/10/234401.jpg. Estuve tratando de elaborar un algoritmo para obtener la secuencia de números entre portada y portada, pero no es constante. Además no creo que ellos usen un algoritmo para colocar una imagen en portada, ellos deben tener un campo cómo: “EsPortada”, con lo cuál es sencillo hacer un WHERE: “traer la imagen de portada del día tal”.

Cómo es seguro que no ellos no me van a dar acceso a su BD, la última opción es sacarlo del HTML crudo, última opción debido a que agregamos una variable de dependencia: si ellos cambian el html de su portal, podría provocar que nuestro código ya no funcione. Pero esperemos que esto no suceda muy a menudo.

¿Cómo convertir HTml Crudo, a un modelo de “objetos” html?

Antes usaba WebClient, para leer el html de una página, y era “manual” la búsqueda de elementos dentro del html. Cómo aprendizaje, es correcto empezar por ahí, pero después, es mejor usar la API: “Html Agility Pack”: http://htmlagilitypack.codeplex.com:

What is exactly the Html Agility Pack (HAP)?

This is an agile HTML parser that builds a read/write DOM and supports plain XPATH or XSLT (you actually don’t HAVE to understand XPATH nor XSLT to use it, don’t worry…). It is a .NET code library that allows you to parse “out of the web” HTML files. The parser is very tolerant with “real world” malformed HTML. The object model is very similar to what proposes System.Xml, but for HTML documents (or streams).

En resumen, permite convertir el contenido texto de HTML en un modelo rico de elementos Xml, que son de fácil lectura, por ejemplo, en mi escenario, si quiero recuperar la imagen de portada puedo hacer lo siguiente:

   1:  

   2: public String getImgPeru21()

   3: {

   4:   String imgPortada = ""; 

   5:  

   6:   hap.HtmlWeb docWeb = new hap.HtmlWeb();

   7:   hap.HtmlDocument doc = docWeb.Load("http://peru21.pe/impresa/");

   8:   foreach (hap.HtmlNode img in 

   9:             doc.DocumentNode.SelectNodes("//img[@title]"))

  10:   {

  11:     hap.HtmlAttribute att = img.Attributes["title"];

  12:     if (att.Value.ToLower() == "impresa")

  13:     {

  14:       imgPortada = img.Attributes["src"].Value;

  15:     }

  16:   } 

  17:  

  18:   return imgPortada;

  19: }

Y nada, con ese pequeño código puedo obtener la imagen de portada del diario Perú 21, siempre y cuando el designer no se despierte inspirado y cambie el diseño base, no haya cambios sustanciales en el diseño de la web.

Saludos,

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *