2009-02-12 13 views
20

Possiedo un'applicazione C# WPF che deve utilizzare i dati esposti in una pagina Web come tabella HTML.C# C'è un LINQ in HTML o qualche altra buona API di manipolazione HTML.?

After getting inspiration from this url Ho provato a utilizzare Linq per Xml per analizzare il documento Html, ma funziona solo se il documento HTML è estremamente ben formato (e non contiene alcun commento o entità HTML al suo interno). Sono riuscito a ottenere una soluzione funzionante utilizzando questa tecnica, ma è tutt'altro che ideale.

Sono in cerca di una soluzione per l'analisi dell'HTML. Ho hackerato "soluzioni" prima, ma sono fragili. Sto cercando un modo efficace di analizzare/manipolare il documento. Preferirei qualcosa che rendesse l'attività facile come sarebbe da Javascript/JQuery.

Qualcuno sa di una buona libreria o utility .Net per l'analisi/manipolazione di HTML?

+0

come va l'html? Tramite il controllo webbrowser, o attraverso una richiesta HttpRequest, o ...? –

+0

Ciao, sto ricevendo l'HTML tramite HttpRequest. –

risposta

12

Anche se non è LINQ basa, suggerisco la ricerca del HTML Agility Pack da CodePlex.

Nota: Html Agility pacchetto supporta ora LINQ to Objects (tramite un LINQ to XML interfaccia Like)

Dalla pagina HTML Agility Confezione:

Si tratta di un parser HTML agile che costruisce un DOM in lettura/scrittura e supporta semplici XPATH o XSLT (in realtà NON DEVI comprendere XPATH o XSLT per usarlo, non preoccuparti ...). È una libreria di codice .NET che consente di analizzare file HTML "fuori dal web". Il parser è molto tollerante con l'HTML malformato del "mondo reale". Il modello a oggetti è molto simile a quello che propone System.Xml, ma per documenti HTML (o flussi).

+1

Hai usato questo prodotto con successo? –

+0

Che cosa significa la sua licenza complessa? –

+0

Sì, ho usato questa libreria per alcuni anni con ottimi risultati. Lo consiglio vivamente a chiunque. Inoltre è disponibile in un pacchetto Nuget, che è molto utile. –

2

HTML è raramente ben formato abbastanza da poter utilizzare in modo affidabile LINQ to XML. È concepibile per che si potrebbe trovare un "pulitore" HTML che potrebbe risolvere la formattazione abbastanza bene da essere letto, ma non sta dicendo quanto sarebbe robusto.

Presumo che si tratti di uno "schermo" che legge da una tabella HTML su cui non si ha il controllo. In questo caso non sollecitare la robustezza, il raschiamento dello schermo è intrinsecamente fragile. Se i requisiti sono impostati in pietra, progettare il raschietto per essere facilmente aggiornabile se/quando il codice HTML che si sta modificando cambia.

2

Ho dovuto farlo in un progetto recente e ho utilizzato LINQ in XML. Se sai che sarà sempre pulito XHTML, probabilmente puoi copiare ricorsivamente il DOM abbastanza facilmente, ma ho usato la libreria di classi HTMLDocument di DevComponents (http://www.devcomponents.com/htmldoc/) per convertire HTML in XML e poi averlo inserito in XElement. Ciò riduce la sfida di portare il tuo HTML in una gerarchia XElement. L'unica avvertenza è che soffoca sugli elementi di script, quindi li ho eliminati con la forza 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); 
    }