C # HTMLAgilityPack VS expressions régulières pour extraire des liens à partir de HTML

c# html-agility-pack html-parsing regex

Question

HTMLAgilityPack's LoadHTML un robot Web C # et lorsque je lance le profilage, je constate que HTMLAgilityPack's LoadHTML méthode HTMLAgilityPack's LoadHTML utilise 10% de l'utilisation totale du processeur par les programmes. Je voudrais essayer de réduire cela.

Je suis sûr qu'une expression régulière serait plus rapide, mais lorsque je regarde les exemples d'extraction de liens sur SO, je vois tout le monde dire que cette méthode devrait être évitée au profit d'un analyseur HTML tel que HTMLAgilityPack .

Comme tout ce que je dois faire est d'extraire des liens à partir de HTML, c'est utiliser HTMLAgilityPack over kill?

Les raisons de privilégier un analyseur HTML sont-elles applicables à mon cas, car je ne l'utilise que pour extraire des liens?


HTML téléchargé avec WebClient puis comparé.

Utilisation de href\\s*=\\s*(?:[\"'](?<1>[^\"']*)[\"']|(?<1>\\S+)) (puis réduire et ajouter à une liste) est bien plus rapide que HTMLAgilityPack.

43 millisecondes contre 3 régulièrement.


Voir mon code sur pastebin

Réponse acceptée

Les raisons de privilégier un analyseur HTML sont-elles applicables à mon cas, car je ne l'utilise que pour extraire des liens?

Dans votre cas, l'analyseur HTML est excessif, comme l'ont montré vos tests.

Les gens qui ont répondu à utiliser afin que comme une réponse à toutes les questions par cœur regex. Il est conseillé d’utiliser cet outil s’il est nécessaire d’analyser de manière plus robuste le domaine du code HTML.


Les personnes qui se sentent trop lentes ou trop lourdes [pour apprendre] trouvent les préjugés contre les expressions régulières. Ce qu'ils proposent pour certaines opérations présente un certain mérite, en ce sens que le texte optimisé spécifique permettant de rechercher des utilitaires fonctionne mieux. Bien sûr, je suis d’accord, mais pour écarter regex, c’est bien comme le cours sur StackOverflow.

Pourquoi ça? Parfois, l'analyse est simplement imparfaite, car le modèle fourni introduit beaucoup de retours en arrière inutiles et n'est pas optimisé. Cela handicape regex hors de la porte. Il faut apprendre le langage des expressions rationnelles et comprendre ce qu’il fait pour régler le moteur de regex de manière à ne pas polluer.

Par exemple, j’ai pris le même test de code C #, mais j’ai utilisé un modèle optimisé, le vôtre et le mien, et j’ai réussi à le réduire à une milliseconde de façon constante!

La plupart des gens apprennent la correspondance de motifs de base en faisant des recherches avec un * . Quand ils apprennent regex pour la première fois, ils utilisent * avec le . tels que .* . Cette étape, combinée à une utilisation aveugle de * , condamnera très probablement tout modèle non débutant à l’enfer des retours en arrière et des réponses lentes.

À moins que vous ne sachiez de façon empirique qu’il n’ya pas d’éléments, utilisez plutôt le + .


En 2009, j’ai écrit sur ce sujet sur mon blog . Les expressions régulières C # .Net sont-elles suffisamment rapides?




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