HtmlAgilityPack et les grands documents HTML

c# html-agility-pack httpwebrequest

Question

J'ai construit un petit robot et maintenant, en l'essayant, j'ai constaté que lors de l'exploration de certains sites, mon robot utilisait 98 à 99% de la CPU.

J'ai utilisé dotTrace pour voir quel était le problème et il m'a orienté vers ma méthode httpwebrequest - je l'ai optimisé un peu à l'aide de questions précédentes sur stackoverflow .. mais le problème était toujours là.

Je suis ensuite allé voir les URL qui étaient à l'origine de la charge du processeur et constaté qu'il s'agissait en fait de sites extrêmement volumineux - allez donc comprendre :) Alors, je suis maintenant à 99% certain que cela concerne le code suivant:

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

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

Tout ce que je veux faire est d'extraire les liens sur la page, donc pour les grands sites .. y at-il de toute façon je peux obtenir cela pour ne pas utiliser autant de CPU?

Je pensais peut-être limiter ce que je vais chercher? Quelle serait ma meilleure option ici?

Certainement quelqu'un doit avoir rencontré ce problème avant :)

Réponse acceptée

".//a[@href]" est XPath extrêmement lent. J'ai essayé de remplacer par "// a [@href]" ou par un code qui parcourt tout le document et vérifie tous les nœuds A.

Pourquoi cette XPath est lente:

  1. "." en commençant par un noeud
  2. "//" sélectionne tous les nœuds descendants
  3. "a" - choisissez seulement "a" nœuds
  4. "@href" avec href.

La partie 1 + 2 se termine par "pour chaque nœud, sélectionnez tous ses nœuds descendants", ce qui est très lent.


Réponse populaire

Si vous n'êtes pas très investi dans le pack d'agilité HTML, essayez plutôt d'utiliser CsQuery . Il crée un index lors de l'analyse des documents et les sélecteurs sont beaucoup plus rapides que HTML Agility Pack. Voir une comparaison.

CsQuery est un port .NET jQuery avec un moteur de sélecteur CSS complet; il vous permet d'utiliser des sélecteurs CSS ainsi que l'API jQuery pour accéder au HTML et le manipuler. C'est sur le nuget comme CsQuery.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi