[英]C# HTMLAgilityPack VS regular expressions for extracting links from HTML
我正在編寫一個C#Web HTMLAgilityPack's LoadHTML
器,運行分析時,我可以看到HTMLAgilityPack's LoadHTML
方法使用了程序總體CPU使用率的10%。 我想嘗試降低這個。
我確定正則表達式會更快,但是當我看SO上的鏈接提取示例時,我看到每個人都說應避免使用此方法,而應使用HTMLAgilityPack
之類的html解析器。
我需要做的就是從HTML提取鏈接是否正在使用HTMLAgilityPack
殺死?
支持HTML解析器的原因是否適用於我的情況,因為我僅將其用於提取鏈接?
然后使用WebClient下載HTML。
使用href\\\\s*=\\\\s*(?:[\\"'](?<1>[^\\"']*)[\\"']|(?<1>\\\\S+))
(然后修剪並添加到列表)比HTMLAgilityPack快得多。
43毫秒,而始終為3毫秒。
在pastebin上查看我的代碼
支持HTML解析器的原因是否適用於我的情況,因為我僅將其用於提取鏈接?
如您的測試所示,在您的情況下,HTML解析器過大了。
依此類推的人將其作為對所有正則表達式問題的死記硬背的答案。 如果人們確實需要以一種更強大的方式解析HTML的域,則應該使用該工具。
對正則表達式的偏見是由覺得自己太慢或太麻煩[無法學習]的人發現的。 他們為某些操作提出的建議有一些優點,因為用於查找實用程序的特定優化文本的性能更好。 當然,我同意,但是不要直接使用正則表達式,這與StackOverflow上的課程是一樣的。
這是為什么 ? 有時分析僅僅是有缺陷的,因為提供的模式會引入很多不必要的回溯並且沒有進行優化。 這妨礙了正則表達式的發展。 確實必須學習正則表達式語言,並了解它正在做些什么以調整正則表達式的引擎以使其不會污染。
比如我拿了你一樣的C#代碼測試,但我用你的優化模式和我自己的,是能夠得到它下降到1毫秒一致!
大多數人通過使用*
進行搜索來學習基本模式匹配。 當他們第一次學習正則表達式時,會將*
與一起使用.
例如.*
。 這一步驟以及對*
不加選擇的使用將很可能使任何非開始的模式注定會陷入回溯和響應緩慢的境地。
除非您憑經驗知道沒有項目,否則請改用+
。
早在2009年,我就在自己的博客上撰寫了有關此主題的文章。C#.Net正則表達式對您來說足夠快了嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.