C # Существует ли LINQ to HTML или какой-либо другой хороший API-интерфейс для манипуляции .Net HTML? - PullRequest
20 голосов
/ 12 февраля 2009

У меня есть приложение C # WPF, которое должно использовать данные, отображаемые на веб-странице в виде таблицы HTML.

После получения вдохновения от этого URL Я пытался использовать Linq to Xml для анализа HTML-документа, но это работает только в том случае, если HTML-документ очень хорошо сформирован (и не имеет комментариев или объектов HTML внутри него). Мне удалось получить рабочее решение, используя эту технику, но это далеко от идеала.

Я ищу решение, предназначенное для анализа HTML. Я взломал «решения» раньше, но они хрупкие. Я после надежного способа анализа / манипулирования документом. В идеале я хотел бы что-то, что делает задачу такой же простой, как это было бы из Javascript / JQuery.

Кто-нибудь знает хорошую библиотеку или утилиту .Net для анализа / манипулирования HTML?

Ответы [ 5 ]

12 голосов
/ 12 февраля 2009

Несмотря на то, что он не основан на LINQ, Я предлагаю исследовать HTML Agility Pack от CodePlex.

Примечание. Html Agility Pack теперь поддерживает Linq to Objects (через интерфейс LINQ to Xml Like)

Со страницы пакета Agility HTML:

Это гибкий анализатор HTML, который создает DOM для чтения / записи и поддерживает простой XPATH или XSLT (вам на самом деле не нужно понимать XPATH или XSLT, чтобы его использовать, не волнуйтесь ...) Это библиотека кода .NET, которая позволяет анализировать HTML-файлы «из Интернета». Синтаксический анализатор очень терпим с искаженным HTML «реального мира». Объектная модель очень похожа на ту, что предлагает System.Xml, но для документов HTML (или потоков).

5 голосов
/ 03 декабря 2009

Здесь есть библиотека LINQ to HTML:

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

2 голосов
/ 12 февраля 2009

Мне пришлось сделать это в недавнем проекте, и я использовал LINQ to XML. Если вы знаете, что это всегда будет чистый XHTML, то вы, вероятно, сможете довольно легко рекурсивно скопировать DOM, но я использовал библиотеку классов DevComponents HTMLDocument (http://www.devcomponents.com/htmldoc/) для преобразования HTML в XML, а затем извлек это в XElement. сложность в переводе вашего HTML в иерархию XElement. Единственное предостережение в том, что он душит элементы скрипта, поэтому я удалил их с помощью грубой силы.

    /// <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);
    }
2 голосов
/ 12 февраля 2009

HTML редко формируется достаточно хорошо, чтобы вы могли надежно использовать LINQ to XML. возможно , что вы можете найти «очиститель» HTML, который мог бы исправить форматирование достаточно хорошо, чтобы его можно было прочитать, но пока неясно, насколько надежным он будет.

Я предполагаю, что это "скребок", который читает из таблицы HTML, над которой у вас нет контроля. В этом случае не стоит зацикливаться на надежности, скребок экрана по своей природе хрупок. Если ваши требования четко изложены, спроектируйте скребок так, чтобы он легко обновлялся, если / когда HTML-код, который вы копируете, меняется.

0 голосов
/ 09 марта 2009

Я разместил код, обеспечивающий функциональность "LINQ to HTML" здесь:

Ищем синтаксический анализатор C # HTML

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...