C#HTMLAgilityPack VS用於從HTML中提取鏈接的正則表達式

c# html-agility-pack html-parsing regex

我正在編寫一個C#網絡爬蟲,當我運行分析時,我可以看到HTMLAgilityPack's LoadHTML方法正在使用10%的程序整體CPU使用率。我想嘗試降低這一點。

我確定正則表達式會更快但是當我看到SO上的鏈接提取示例時,我看到每個人都應該避免使用像HTMLAgilityPack這樣的html解析器。

我需要做的就是從HTML中提取鏈接使用HTMLAgilityPack over kill?

贊成HTML解析器的原因是否適用於我的情況,因為我只使用它來提取鏈接?


然後與WebClient下載HTML進行比較。

使用href\\s*=\\s*(?:[\"'](?<1>[^\"']*)[\"']|(?<1>\\S+)) (然後修剪和添加到列表)比HTMLAgilityPack更快。

43毫秒相比3個一致。


看看我在pastebin上的代碼

一般承認的答案

贊成HTML解析器的原因是否適用於我的情況,因為我只使用它來提取鏈接?

在您的情況下,HTML解析器在您的測試顯示時過度。

回答SO的人使用它作為所有正則表達式問題的死記硬背的答案。如果實際上需要以更健壯的方式解析HTML的域,則應該使用該工具。


對於正則表達式的偏見是由那些覺得它們太慢或太麻煩[學習]的人發現的。對於某些操作,他們提出的建議有一些優點,因為找到實用程序的特定優化文本確實表現更好。當然我同意,但是要解除正則表達式,這對於StackOverflow的課程來說是相同的。

那是為什麼 ?有時分析是有缺陷的,因為提供的模式引入了許多不必要的回溯並且沒有進行優化。這使得正則表達式失控。人們必須學習正則表達式語言並理解它正在做什麼來調整正則表達式引擎以防止污染。

比如我拿了你一樣的C#代碼測試,但我用你的優化模式和我自己的,是能夠得到它下降到1毫秒一致!

大多數人通過使用*進行搜索來學習基本模式匹配。當他們第一次學習正則表達式時,他們會使用* .例如.* 。這一步以及對*不加選擇的使用很可能會使任何非開始模式陷入回溯和緩慢響應的地獄。

除非您根據經驗知道沒有物品,否則請使用+


回到2009年,我在我的博客上寫了關於這個主題的文章.C#.Net正則表達式對你來說足夠快嗎?



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因