Подтвердить что ты не робот

С# Есть ли LINQ to HTML или какой-нибудь другой хороший API-интерфейс HTML-манипуляции?

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

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

Я получаю решение, предназначенное для синтаксического анализа HTML. Раньше я взломал "решения", но они хрупкие. Я после тщательного анализа синтаксического разбора/манипулирования документом. Мне идеально понравилось бы то, что делает задачу такой же простой, как и в Javascript/JQuery.

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

4b9b3361

Ответ 1

Хотя это не LINQ based, Я предлагаю исследовать HTML Agility Pack из CodePlex.

Примечание: Html Agility Pack теперь поддерживает Linq для объектов (через интерфейс LINQ to Xml Like)

На странице HTML Agility Pack:

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

Ответ 3

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

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

Ответ 4

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

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