C # ¿Hay un LINQ a HTML, o alguna otra buena API de manipulación HTML .Net?

Tengo una aplicación C # WPF que necesita consumir datos que están expuestos en una página web como una tabla HTML.

Después de obtener inspiración de esta url , traté de usar Linq a Xml para analizar el documento Html, pero esto solo funciona si el documento HTML está muy bien formado (y no tiene ningún comentario o entidad HTML dentro). Logré obtener una solución funcional usando esta técnica, pero está lejos de ser ideal.

Estoy buscando una solución destinada a analizar HTML. He pirateado “soluciones” antes, pero son frágiles. Estoy buscando una manera robusta de analizar / manipular el documento. Idealmente, me gustaría algo que haga la tarea tan fácil como lo sería desde Javascript / JQuery.

¿Alguien sabe de una buena biblioteca .Net o utilidad para analizar / manipular HTML?

Aunque no está basado en LINQ, Sugiero investigar HTML Agility Pack de CodePlex.

Nota: Html Agility Pack ahora es compatible con Linq to Objects (a través de una interfaz LINQ to Xml Like)

Desde la página de HTML Agility Pack:

Este es un analizador de HTML ágil que construye un DOM de lectura / escritura y admite XPATH o XSLT simples (en realidad no TIENES que entender XPATH ni XSLT para usarlo, no te preocupes …). Es una biblioteca de códigos .NET que le permite analizar archivos HTML “fuera de la web”. El analizador es muy tolerante con el HTML malformado del “mundo real”. El modelo de objetos es muy similar a lo que propone System.Xml, pero para documentos HTML (o streams).

Aquí hay una biblioteca LINQ to HTML:

http://www.superstarcoders.com/linq-to-html.aspx

HTML rara vez está lo suficientemente formado como para que pueda usar LINQ a XML de manera confiable. Es concebible que pueda encontrar un “limpiador” HTML que pueda corregir el formato lo suficientemente bien como para ser leído, pero no se sabe qué tan robusto sería.

Supongo que se trata de un “screenscraper” que lee desde una tabla HTML sobre la que no tiene control. No se estrese por la solidez en este caso, el raspado de pantalla es intrínsecamente frágil. Si sus requisitos son inamovibles, diseñe el raspador para que sea fácilmente actualizable si / cuando cambia el código HTML que está raspando.

Tuve que hacer esto en un proyecto reciente y utilicé LINQ to XML. Si sabes que siempre va a ser un XHTML limpio, probablemente puedas copiar el DOM de manera recursiva con bastante facilidad, pero utilicé la biblioteca de clases DevComponents HTMLDocument ( http://www.devcomponents.com/htmldoc/ ) para convertir HTML a XML y luego tiré eso en un XElement. Esto reduce el desafío de convertir su HTML en una jerarquía XElement. La única advertencia es que se atasca en los elementos del script, así que los borré por la fuerza bruta.

///  /// Extracts an HtmlDocument DOM to an XElement DOM that can be queried using LINQ to XML. ///  /// HtmlDocument containing DOM of page to extract. /// HTML content as  for consumption by LINQ to XML. public XElement ExtractXml(HtmlDocument htmlDocument) { XmlDocument xmlDoc = htmlDocument.ToXMLDocument(); // Find and remove all script tags from XML DOM or LINQ to XML will choke on XElement.Parse(XmlDocument). IList nodes = new List(); foreach (XmlNode node in xmlDoc.GetElementsByTagName("script")) nodes.Add(node); foreach (XmlNode node in nodes) node.ParentNode.RemoveChild(node); return XElement.Parse(xmlDoc.OuterXml); } 

He publicado un código que proporciona la funcionalidad “LINQ a HTML” aquí:

Buscando el analizador HTML C #