Buscar este blog

miércoles, 31 de marzo de 2010

Parseando html con HtmlAgilityPack

Con la librería HtmlAgilityPack para .Net es muy sencillo cargar archivos de html y manejar sus objetos programáticamente. Es cierto que también se puede hacer con la clase HtmlDocument de las librerías base de .Net, pero esta clase tiene como ventaja que no necesita una ventana para funcionar por lo que puede usarse en una dll o un ejecutable de consola, además puedes bajar solo lo que necesitas y no el documento con todas sus imágenes y scripts.
Para usarla declaramos una variable de la clase y usamos el método LoadHtml para cargar el documento, el argumento debe ser una cadena conteniendo el html, de momento no se pueden cargar documentos directamente:

HtmlAgilityPack.HtmlDocument doc
                = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(htmlstring);

Una vez que tenemos cargado el html podemos usar sus objetos programáticamente, para encontrar el nodo base del documento (que podria ser html), tenemos la propiedad DocumentNode:

doc.DocumentNode

Para buscar un nodo especifico a partir de otro nodo tenemos el método SelectNodes que toma como argumento una cadena con una expresión de XPath, por ejemplo para encontrar una tabla con ancho de 100%:

doc.DocumentNode.SelectNodes("//table[@width='100%']")[0]

Nótese que tomamos el primer elemento, ya que el método obtiene una colección con todos los elementos que cumplen la condición, alternativamente el método SelectSingleNode que obtiene solo el primer elemento.
Para obtener un elemento en particular de un nodo también podemos usar la colección ChildNodes del nodo la cual contiene todos los elementos directos del nodo:


doc.DocumentNode.SelectNodes("//table[@width='100%']")[0].ChildNodes[1]

En conclusión HtmlAgilityPack es una herramienta muy robusta y útil para lidiar con html, acepta html con errores y nos permite manejarlo de manera similar a Xml.

No hay comentarios:

Publicar un comentario