C # HTMLAgilityPack VS регулярные выражения для извлечения ссылок из HTML

c# html-agility-pack html-parsing regex

Вопрос

Я пишу веб-искатель C #, и когда я запускаю профилирование, я вижу, что HTMLAgilityPack's LoadHTML использует 10% общего использования процессором. Я хотел бы попытаться снизить это.

Я уверен, что регулярное выражение будет быстрее, но поскольку я смотрю на примеры извлечения ссылок на SO, я вижу, что все говорят, что этот метод следует избегать в пользу анализатора html, такого как HTMLAgilityPack .

Как все, что мне нужно сделать, это извлечь ссылки из HTML, используя HTMLAgilityPack over kill?

Являются ли причины для использования парсера HTML применимыми к моему делу, поскольку я использую его только для извлечения ссылок?


Загруженный HTML-код с WebClient затем сравнивается.

Используя href\\s*=\\s*(?:[\"'](?<1>[^\"']*)[\"']|(?<1>\\S+)) (тогда обрезка и добавление в список) быстрее, чем HTMLAgilityPack.

43 миллисекунды по сравнению с 3 последовательно.


Смотрите мой код на pastebin

Принятый ответ

Являются ли причины для использования парсера HTML применимыми к моему делу, поскольку я использую его только для извлечения ссылок?

В вашем случае анализатор HTML слишком переполнен, как показали ваши тесты.

Люди , которые отвечают на SO использовать это в качестве механического ответа на все вопросы регулярных выражений. Нужно использовать этот инструмент, если на самом деле нужно более тщательно анализировать домен HTML.


Пристрастие к регулярным выражениям обнаруживают люди, которые считают, что они слишком медленны или громоздки [учиться]. Существует определенная заслуга в том, что они предлагают для определенных операций, в том, что конкретный оптимизированный текст для поиска утилит лучше работает. Конечно, я согласен, но увольнять регулярное выражение из-под контроля, ну, что соответствует курсу на StackOverflow.

Почему ? Иногда анализ просто ошибочен, потому что представленная схема вводит много ненужного обратного отслеживания и не оптимизирована. Это гандикап-повтор из ворот. Нужно изучить язык регулярных выражений и понять, что он делает, чтобы настроить двигатель регулярного выражения, чтобы не загрязнять.

Например , я взял свой же C # код тест, но я использовал оптимизированный шаблон твой и мой , и был в состоянии получить его до 1 миллисекунду последовательно!

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

Если вы не знаете эмпирически , что не существует никаких элементов, используйте + вместо этого.


Еще в 2009 году я написал об этой теме в своем блоге. Являются ли регулярные выражения C # .Net регулярными для вас?



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему