Ich schreibe einen C # HTMLAgilityPack's LoadHTML
Crawler und wenn ich das Profiling HTMLAgilityPack's LoadHTML
kann ich sehen, dass HTMLAgilityPack's LoadHTML
Methode HTMLAgilityPack's LoadHTML
10% der gesamten CPU-Auslastung der Programme verwendet. Ich würde es gerne versuchen und senken.
Ich bin mir sicher, dass ein regulärer Ausdruck schneller wäre, aber wenn ich Beispiele für Link-Extrahierung auf SO anschaue, sehe ich, dass diese Methode zugunsten eines HTML-Parsers wie HTMLAgilityPack
vermieden werden sollte.
Als alles, was ich tun muss, ist das Extrahieren von Links aus HTML mit HTMLAgilityPack
über Kill?
Sind die Gründe für die Bevorzugung eines HTML-Parsers in meinem Fall anwendbar, da ich ihn nur zum Extrahieren von Links verwende?
HTML mit WebClient heruntergeladen und dann verglichen.
Verwenden Sie href\\s*=\\s*(?:[\"'](?<1>[^\"']*)[\"']|(?<1>\\S+))
(dann trimmen und zu einer Liste hinzufügen) ist viel schneller als HTMLAgilityPack.
43 Millisekunden im Vergleich zu 3 konsistent.
Siehe meinen Code auf Pastebin
Sind die Gründe für die Bevorzugung eines HTML-Parsers in meinem Fall anwendbar, da ich ihn nur zum Extrahieren von Links verwende?
In Ihrem Fall ist der HTML-Parser übertrieben, wie Ihre Tests gezeigt haben.
Leute, die auf SO antworten, benutzen das als eine rote Antwort auf alle Regex-Fragen. Man sollte das Tool verwenden, wenn man die Domäne des HTML tatsächlich robuster parsen muss.
Vorurteile gegen reguläre Ausdrücke werden von Menschen gefunden, die das Gefühl haben, zu langsam oder schwerfällig zu sein. Es gibt einige Vorteile in Bezug auf das, was von ihnen für bestimmte Operationen vorgeschlagen wird, da ein bestimmter optimierter Text zum Auffinden von Dienstprogrammen besser ist. Natürlich stimme ich zu, aber um Regex aus der Hand zu geben, ist das für StackOverflow selbstverständlich.
Warum ist das so? Manchmal ist die Analyse einfach fehlerhaft, weil das bereitgestellte Muster viel unnötiges Zurückverfolgen einführt und nicht optimiert ist. Das behebt Regex aus dem Tor. Man muss die Regex-Sprache lernen und verstehen, was es tut, um die Engine von Regex so einzustellen, dass sie nicht verschmutzt.
Zum Beispiel habe ich den gleichen C # -Code-Test gemacht, aber ich habe ein optimiertes Muster von dir und meinem eigenen verwendet und konnte es konstant auf 1 Millisekunde heruntersetzen!
Die meisten Menschen lernen den grundlegenden Mustervergleich, indem sie Suchen mit einem *
. Wenn sie zum ersten Mal Regex lernen, benutzen sie *
mit dem .
wie .*
. Dieser Schritt zusammen mit der wahllosen Verwendung des *
wird höchstwahrscheinlich jedes nicht beginnende Muster zur Hölle des Zurückverfolgens und langsamer Antworten verderben.
Sofern Sie nicht empirisch wissen, dass es keine Elemente gibt, verwenden Sie stattdessen das +
.
Zurück im Jahr 2009 schrieb ich über dieses Thema in meinem Blog Sind C # .Net Reguläre Ausdrücke schnell genug für Sie?