2009-02-12 3 views
20

Ich habe eine C# -WPF-Anwendung, die Daten konsumieren muss, die auf einer Webseite als HTML-Tabelle verfügbar gemacht wird.C# Gibt es eine LINQ to HTML oder eine andere gute .NET HTML-API?

After getting inspiration from this url Ich habe versucht, Linq zu Xml zu verwenden, um das HTML-Dokument zu analysieren, aber das funktioniert nur, wenn das HTML-Dokument extrem gut gebildet ist (und keine Kommentare oder HTML-Elemente enthält). Ich habe es geschafft, eine funktionierende Lösung mit dieser Technik zu bekommen, aber es ist alles andere als ideal.

Ich bin nach einer Lösung, die zum Parsen von HTML bestimmt ist. Ich habe früher "Lösungen" gehackt, aber sie sind spröde. Ich bin nach einer robusten Art des Parsens/Manipulierens des Dokuments. Am besten gefällt mir etwas, das die Aufgabe so einfach macht wie von Javascript/JQuery.

Kennt jemand eine gute .Net-Bibliothek oder ein Dienstprogramm zum Parsen/Bearbeiten von HTML?

+0

wie sind Sie immer der HTML? Über das Webbrowser-Steuerelement oder über einen HttpRequest oder ...? –

+0

Hallo, Ich bekomme den HTML-Code über eine HttpRequest. –

Antwort

12

Auch wenn es ist nicht basierend LINQ, Ich schlage vor, die HTML Agility Pack von CodePlex zu erforschen.

Hinweis: Html Agility Pack unterstützt jetzt Linq to Objects (über eine LINQ to XML-ähnliche Oberfläche)

Vom HTML Agility Pack-Seite:

Dies ist ein wendiger und HTML-Parser, baut ein Lese-/Schreib-DOM und unterstützt Plain XPATH oder XSLT (Sie müssen XPATH oder XSLT eigentlich nicht verstehen, um es zu benutzen, keine Sorge ...). Es ist eine .NET-Code-Bibliothek, mit der Sie HTML-Dateien "aus dem Web" analysieren können. Der Parser ist sehr tolerant gegenüber "realem" HTML-Code. Das Objektmodell ähnelt sehr dem, was System.Xml vorschlägt, aber für HTML-Dokumente (oder Streams).

+1

Haben Sie dieses Produkt erfolgreich eingesetzt? –

+0

Was bedeutet komplexe Lizenz? –

+0

Ja, ich benutze diese Bibliothek seit einigen Jahren mit großartigen Ergebnissen. Ich kann es jedem empfehlen. Es kommt auch in einem Nuget-Paket, das sehr nützlich ist. –

2

HTML ist selten so gut geformt, dass Sie LINQ to XML zuverlässig verwenden können. Es ist denkbar, dass Sie einen HTML "Reiniger" finden könnten, der die Formatierung gut genug zum Lesen beheben könnte, aber es gibt nicht zu sagen, wie robust es wäre.

Ich nehme an, dies ist ein "screenscraper", der aus einer HTML-Tabelle liest, über die Sie keine Kontrolle haben. Achten Sie in diesem Fall nicht auf die Robustheit, Screen-Scraping ist inhärent brüchig. Wenn Ihre Anforderungen in Stein gemeißelt sind, gestalten Sie den Scraper so, dass er leicht aktualisiert werden kann, wenn sich der HTML-Code ändert, den Sie scrapen.

2

Ich musste dies in einem aktuellen Projekt tun, und ich verwendete LINQ zu XML. Wenn Sie wissen, dass es sauberes XHTML sein wird, dann können Sie das DOM wahrscheinlich rekursiv kopieren, aber ich benutzte die DevComponents HTMLDocument Klassenbibliothek (http://www.devcomponents.com/htmldoc/), um HTML in XML umzuwandeln und dann in ein XElement zu ziehen. Dies reduziert die Herausforderung, Ihr HTML in eine XElement-Hierarchie zu bringen. Der einzige Nachteil ist, dass es an Skriptelementen erstickt, also habe ich diese mit roher Gewalt gelöscht.

/// <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); 
    }