2009-02-12 17 views
20

Mam aplikację C# WPF, która musi zużywać dane, które są narażone na stronie internetowej jako tabela HTML.C# Czy istnieje LINQ do HTML lub inny dobry interfejs API manipulacji HTML .NET?

After getting inspiration from this url Próbowałem użyć Linq do Xml do parsowania dokumentu HTML, ale działa to tylko wtedy, gdy dokument HTML jest bardzo dobrze uformowany (i nie ma w nim żadnych komentarzy ani elementów HTML). Udało mi się uzyskać działające rozwiązanie za pomocą tej techniki, ale jest to dalekie od ideału.

Jestem po rozwiązanie, które jest przeznaczone do parsowania HTML. Przedtem zhackowałem "rozwiązania", ale są one kruche. Zajmuję się solidnym sposobem analizowania/manipulowania dokumentem. Idealnie podoba mi się coś, co sprawia, że ​​zadanie jest tak łatwe, jak byłoby to z Javascript/JQuery.

Czy ktoś wie o dobrej bibliotece .Net lub narzędziu do parsowania/manipulowania HTML?

+0

jak się masz html? Przez kontrolkę przeglądarki lub przez HttpRequest, czy ...? –

+0

Witam, otrzymuję kod HTML za pośrednictwem HttpRequest. –

Odpowiedz

12

Mimo to nie LINQ oparte Proponuję badając HTML Agility Pack od CodePlex.

Uwaga: HTML Agility Pakiet obsługuje Linq do obiektów (za pomocą LINQ do XML interfejsu podobnego)

ze strony HTML Agility spakowaniu:

Jest zwinny parser HTML, który buduje DOM do odczytu/zapisu i obsługuje zwykły XPATH lub XSLT (właściwie NIE MUSISZ zrozumieć XPATH ani XSLT, aby go użyć, nie martw się ...). Jest to biblioteka kodu .NET, która umożliwia analizowanie plików HTML "out of the web". Analizator składni jest bardzo tolerancyjny w stosunku do "prawdziwego świata", który źle skonstruował HTML. Model obiektowy jest bardzo podobny do tego, który proponuje System.Xml, ale do dokumentów HTML (lub strumieni).

+1

Czy używałeś tego produktu z powodzeniem? –

+0

Co oznacza złożona licencja? –

+0

Tak Korzystam z tej biblioteki od kilku lat z doskonałymi wynikami. Gorąco polecam to każdemu. Jest również dostępny w pakiecie Nuget, który jest bardzo przydatny. –

2

HTML jest rzadko wystarczająco dobrze ukształtowany, abyś mógł niezawodnie używać LINQ do XML. Można sobie wyobrazić, że istnieje "czystszy" HTML, który mógłby naprawić formatowanie na tyle dobrze, aby można go było odczytać, ale nie wiadomo, jakie to będzie solidne.

Zakładam, że jest to "wygaszacz ekranu" odczytujący tabelę HTML, nad którą nie masz kontroli. W tym przypadku nie obciążaj zbytnio solidnością, skrobanie ekranu jest z natury kruche. Jeśli twoje wymagania są ustawione na kamień, zaprojektuj skrobak tak, aby był łatwo aktualizowalny, jeśli/kiedy skrobak HTML zmieni się.

2

Musiałem to zrobić w ostatnim projekcie i użyłem LINQ do XML. Jeśli wiesz, że zawsze będzie to czysty XHTML, prawdopodobnie możesz rekursywnie skopiować DOM dość łatwo, ale użyłem biblioteki klasy HTMLDocument DevComponents (http://www.devcomponents.com/htmldoc/), aby przekonwertować HTML na XML, a następnie wyciągnąłem go do XElement. Zmniejsza to wyzwanie związane z umieszczeniem kodu HTML w hierarchii XElement. Jedynym zastrzeżeniem jest dławienie elementów skryptu, więc usunąłem je za pomocą brutalnej siły.

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