2009-02-12 21 views
20

Tengo una aplicación C# WPF que necesita consumir datos que están expuestos en una página web como una tabla HTML.C# ¿Hay un LINQ a HTML, o alguna otra buena API de manipulación HTML .Net?

After getting inspiration from this url Intenté 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 que esté pensada para 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?

+0

¿cómo te va el html? A través del control del navegador web, oa través de HttpRequest, o ...? –

+0

Hola, estoy obteniendo el HTML a través de HttpRequest. –

Respuesta

12

A pesar de que no se basa LINQ, que sugieren la investigación de la HTML Agility Pack de CodePlex.

Nota: HTML agilidad paquete ahora es compatible con LINQ a Objetos (a través de un LINQ to XML interfaz Like)

Desde la página HTML agilidad Paquete:

Este es un analizador de HTML ágil que construye un DOM de lectura/escritura y admite XPATH o XSLT simples (en realidad NO TIENE que entender XPATH ni XSLT para usarlo, no se preocupe ...). 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).

+1

¿Ha utilizado este producto con éxito? –

+0

¿Qué significa licencia compleja? –

+0

Sí, he usado esta biblioteca desde hace unos años con excelentes resultados. Lo recomendaría a cualquiera. También viene en un paquete Nuget, que es muy útil. –

2

HTML rara vez está lo suficientemente formado como para poder usar LINQ a XML de manera confiable. Es concebible que podría encontrar un "limpiador" de HTML que podría arreglar el formato lo suficientemente bien como para ser leído, pero no está diciendo cuán robusto sería.

Supongo que se trata de un "screenscraper" que se 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.

2

Tuve que hacer esto en un proyecto reciente y utilicé LINQ para XML. Si sabes que siempre va a ser un XHTML limpio, entonces probablemente puedas copiar el DOM de forma recursiva con bastante facilidad, pero utilicé la biblioteca de clases DevComponents HTMLDocument (http://www.devcomponents.com/htmldoc/) para convertir HTML a XML y luego lo extraje 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.

/// <summary> 
    /// Extracts an HtmlDocument DOM to an XElement DOM that can be queried using LINQ to XML. 
    /// </summary> 
    /// <param name="htmlDocument">HtmlDocument containing DOM of page to extract.</param> 
    /// <returns>HTML content as <see cref="XElement" /> for consumption by LINQ to XML.</returns> 
    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<XmlNode> nodes = new List<XmlNode>(); 
     foreach (XmlNode node in xmlDoc.GetElementsByTagName("script")) 
      nodes.Add(node); 
     foreach (XmlNode node in nodes) 
      node.ParentNode.RemoveChild(node); 

     return XElement.Parse(xmlDoc.OuterXml); 
    } 
Cuestiones relacionadas