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

Является ли Html Agility Pack еще лучшим .NET-парсером .NET?

Html Agility Pack был дан как ответ на вопрос qaru.site/info/51750/... время назад, это все же лучший вариант? Какие еще варианты следует учитывать? Есть ли что-то более легкое?

4b9b3361

Ответ 1

Существует таблица с сопоставлениями.

Вкратце:

Производительность CsQuery и Html Agility Pack и Fizzler Я собрал вместе некоторые тесты производительности для сравнения CsQuery с единственным практическим альтернатива, которую я знаю (Fizzler, расширение HtmlAgilityPack). я проверено на три разных документа:

  • Тест-лист (примерно 11 k)
  • Вход в википедию для "сыра" (около 170 k)
  • Одностраничная спецификация HTML 5 (около 6 мегабайт)

Общие результаты:

  • HAP быстрее загружает строку HTML в объектную модель. Это имеет смысл, так как я не думаю, что Fizzler строит индекс (или возможно, он строит только относительно простой). CsQuery принимает от 1,1 до 2,6 раза дольше, чтобы загрузить документ. Подробнее об этом ниже.
  • CsQuery быстрее для всего остального. Иногда - 10 000 или более. Единственным исключением является селектор "*", где иногда Fizzler быстрее. Для всех тестов результаты полностью перечислены; этот случай приводит только к каждому node в дереве, являющемся перечислены. Таким образом, это не проверяет механизм выбора так, как структуры данных.
  • CsQuery лучше справился с возвратом тех же результатов, что и браузер. Каждый из этих селекторов был проверен в отношении того же документа в Chrome с использованием jQuery 1.7.2, и числа соответствуют тем, которые были возвращены CsQuery. Вероятно, это связано с тем, что HtmlAgilityPack обрабатывает необязательные (отсутствующие) теги по-разному. Кроме того, nth-child не реализован полностью в Fizzler - он поддерживает только простые значения (не формулы).

Ответ 2

Когда дело доходит до разбора HTML, нет никакого сравнения с реальной вещью. Это С# порт анализатора validator.nu. Это та же самая база кода, используемая браузерами на основе Gecko (например, Firefox). Там репо выглядит немного пыльным, но не обманывайся. Порт выдающийся. Это просто было упущено. Я интегрировал его в CsQuery около месяца назад. Он передает все тесты CsQuery (которые включают большинство тестов jQuery и Sizzle, перенесенных на С#).

Мне не известны никакие другие синтаксические анализаторы HTML5, написанные на С#, или даже те, которые приходят удаленно близко к хорошей работе с точки зрения отсутствия, необязательной и недопустимой обработки тегов. Это не просто отличная работа, хотя это соответствует стандартам.

Репо, с которым я связан выше, является исходным портом, он включает базовую оболочку, которая создает дерево XML node. CsQuery версии 1.3 и выше используют этот синтаксический анализатор.

Ответ 3

Html Agility Pack был дан как ответ на вопрос StackOverflow некоторое время назад

Html Agility Pack по-прежнему является выдающимся решением для анализа HTML.

- это еще лучший вариант?

лучше? хорошо, что все зависит от поставленной задачи, но в целом я так думаю. Бывают случаи, когда он не идеален, но обычно он отлично справится.

Есть ли что-то более легкое?

Вы можете попробовать следующее: http://csharptest.net/browse/src/Library/Html/ Это не что иное, как полный набор исходных файлов, которые выделяют HTML/XML через Regex. Он поддерживает легкий DOM и XPath, но не намного больше. (содержание справки)

[Пример]

public void TestParse() {
        string notxml = "<html id=a ><body foo='bar' bar=\"foo\" />";
        var html = new HtmlLightDocument(notxml).Root;

        Assert.AreEqual("html", html.TagName);
        Assert.AreEqual(1, html.Attributes.Count);
        Assert.AreEqual("a", html.Attributes["id"]);
        Assert.AreEqual(1, html.Children.Count);
}

В качестве альтернативы вы можете использовать синтаксический анализатор напрямую вместо создания дерева DOM. Просто реализуйте интерфейс IXmlLightReader и вызывайте статический XmlLightParser.Parse.

PS: Было написано, чтобы решить внутреннюю дискуссию: что Regex может анализировать HTML! С тех пор мы на самом деле нашли много применений для него, так как он достаточно легкий, чтобы внедрять где угодно. Есть еще способы запутать конструктор иерархии DOM, но я не нашел HTML-код, который не будет обрабатывать парсер.

Ответ 4

Существует также AngleSharp

AngleSharp - это библиотека .NET, которая дает вам возможность анализировать гипертексты с угловыми скобками, такие как HTML, SVG и MathML. XML без проверки также поддерживается библиотекой. Важным аспектом AngleSharp является то, что CSS также может быть проанализирован. Парсер построен на официальной спецификации W3C. Это дает совершенно портативное представление HTML5 DOM данного исходного кода. Также текущие функции, такие как querySelector или querySelectorAll, работают для обхода дерева.

Ответ 5

Я использовал это раньше, довольно простой в использовании api. Я думаю, что в С#/.NET domain это очень хороший выбор.

Здесь есть java-библиотека здесь. Выглядит неплохо, хотя у меня нет личного опыта.

Ответ 6

best - очень относительный термин, для вашего вопроса, я думаю, вы ищете надежный инструмент, поэтому я считаю, что эту функцию следует учитывать. Я бы искал поддержку и силу компании, которая предоставляет инструмент. Это ужасное чувство, когда вы пытаетесь связаться с поддержкой любого инструмента, который использует и отвечает, эта компания больше не существует. Поскольку HAP поддерживается сообществом разработчиков, я бы скорее доверял ей.

Ответ 7

Если вы готовы смотреть за пределы мира .NET сообщество Python SO рекомендует Beautiful Soup, например html-parser-in-python.

Beautiful Soup - это парсер Python HTML/XML, предназначенный для быстрого преобразования проектов, таких как скрипирование экрана.