Является ли Html Agility Pack лучшим анализатором HTML для.NET?
Html Agility Pack был дан как ответ на вопрос Stackru некоторое время назад, это все еще лучший вариант? Какие еще варианты следует рассмотреть? Есть ли что-то более легкое?
7 ответов
Есть таблица с сравнениями.
В итоге:
Производительность CsQuery и Html Agility Pack и Fizzler Я собрал несколько тестов производительности, чтобы сравнить CsQuery с единственной практической альтернативой, которую я знаю (Fizzler, расширение HtmlAgilityPack). Я проверил по трем различным документам:
- Испытательный документ на шипение (около 11 кг)
- Запись в Википедии для "сыра" (около 170 к)
- Одностраничная спецификация HTML 5 (около 6 мегабайт)
Общие результаты:
- HAP быстрее загружает строку HTML в объектную модель. Это имеет смысл, поскольку я не думаю, что Fizzler строит индекс (или, возможно, он строит только относительно простой). CsQuery загружает документ в 1,1-2,6 раза дольше. Подробнее об этом ниже.
- CsQuery быстрее почти для всего остального. Иногда в 10000 и более раз. Единственным исключением является селектор "*", где иногда Fizzler работает быстрее. Для всех тестов результаты полностью перечисляются; этот случай просто приводит к перечислению каждого узла в дереве. Так что это не проверяет механизм выбора, а структуру данных.
- CsQuery работал лучше, возвращая те же результаты, что и браузер. Каждый из селекторов здесь был проверен на соответствие одному и тому же документу в Chrome с использованием jQuery 1.7.2, и числа совпадают с числами, возвращенными CsQuery. Вероятно, это связано с тем, что HtmlAgilityPack по-разному обрабатывает необязательные (отсутствующие) теги. Кроме того, nth-child не полностью реализован в Fizzler - он поддерживает только простые значения (не формулы).
Когда дело доходит до парсинга HTML, нет никакого сравнения с реальным. Это порт C# парсера validator.nu. Это та же самая база кода, которая используется в браузерах на основе Gecko (например, Firefox). Там репо выглядит немного пыльно, но не обманывайте себя... порт выдающийся. Это просто упустили из виду. Я интегрировал его в CsQuery около месяца назад. Он проходит все тесты CsQuery (включая большинство тестов jQuery и Sizzle, портированных на C#).
Мне неизвестны какие-либо другие HTML5-парсеры, написанные на C#, или даже те, которые отдаленно близки к выполнению хорошей работы с точки зрения отсутствия, необязательности и недопустимой обработки тегов. Это не только делает большую работу - это соответствует стандартам.
Репозиторий, на который я ссылался выше, является исходным портом, он включает в себя базовую оболочку, которая создает дерево узлов XML. CsQuery версии 1.3 и выше используют этот синтаксический анализатор.
Также есть AngleSharp
AngleSharp - это библиотека.NET, которая позволяет анализировать гипертексты на основе угловых скобок, такие как HTML, SVG и MathML. XML без проверки также поддерживается библиотекой. Важным аспектом AngleSharp является то, что CSS также может быть проанализирован. Парсер построен по официальной спецификации W3C. Это создает совершенно переносимое представление HTML5 DOM данного исходного кода. Также текущие функции, такие как querySelector или querySelectorAll, работают для обхода дерева.
Html Agility Pack был дан как ответ на вопрос Stackru некоторое время назад
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, который бы парсер не обрабатывал.
best, это очень относительный термин, для вашего вопроса, я думаю, вы ищете надежный инструмент, поэтому я думаю, что эта функция должна быть принята во внимание. Я хотел бы искать поддержку и силу компании, которая предоставляет инструмент. Это ужасное чувство, когда вы пытаетесь обратиться в службу поддержки для любого инструмента, который использует, и ответ, что эта компания больше не существует. Поскольку HAP поддерживается сообществом разработчиков, я бы предпочел ей доверять.
Я использовал это раньше, довольно легкий для потока API. Я думаю, что в C#/.NET домен, это очень хороший выбор.
Здесь есть библиотека Java. Выглядит довольно хорошо, хотя у меня нет личного опыта.
Если вы готовы смотреть за пределы .NET
мир, Python
Сообщество SO рекомендует Beautiful Soup, например, html-parser-in-python.
Beautiful Soup - это синтаксический анализатор Python HTML/XML, разработанный для быстрых поворотных проектов, таких как очистка экрана.