HtmlAgilityPack и большие HTML-документы

c# html-agility-pack httpwebrequest

Вопрос

Я создал небольшой искатель, и теперь, когда я его проверял, я обнаружил, что при сканировании некоторых сайтов мой искатель использует 98-99% CPU.

Я использовал dotTrace чтобы посмотреть, что может быть проблемой, и указала мне на мой метод httpwebrequest - я немного оптимизировал его с помощью некоторых предыдущих вопросов здесь, в stackoverflow .. но проблема все еще была.

Затем я пошел посмотреть, какие URL-адреса, которые вызывают загрузку процессора, и обнаружили, что на самом деле это сайты, которые очень велики по размеру - идите на фигуру :) Итак, теперь я на 99% уверен, что это связано с следующим фрагментом кода:

HtmlAgilityPack.HtmlDocument documentt = new HtmlAgilityPack.HtmlDocument();
HtmlAgilityPack.HtmlNodeCollection list;
HtmlAgilityPack.HtmlNodeCollection frameList;

documentt.LoadHtml(_html);
list = documentt.DocumentNode.SelectNodes(".//a[@href]");

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

Я думал, может быть, ограничить то, что я принесу? Какой был бы мой лучший вариант здесь?

Конечно, кто-то, должно быть, столкнулся с этой проблемой раньше :)

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

«.//a[@href]« чрезвычайно медленный XPath. Попробовал заменить на «// a [@href]» или с кодом, который просто просматривает весь документ и проверяет все узлы A.

Почему этот XPath медленный:

  1. "" начиная с узла
  2. "//" выберите все дочерние узлы
  3. «a» - выбрать только «a» узлы
  4. «@href» с href.

Порция 1 + 2 заканчивается тем, что «для каждого узла выбирают все его узлы-потомки», что очень медленно.


Популярные ответы

Если вы не инвестируете в Html Agility Pack, попробуйте вместо этого использовать CsQuery . Он создает индекс при анализе документов, а селекторы намного быстрее, чем HTML Agility Pack. См. Сравнение.

CsQuery - это порт .NET jQuery с полным механизмом селектора CSS; он позволяет использовать селектор CSS, а также jQuery API для доступа и управления HTML. Это на nuget как CsQuery.



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow