我正在编写一个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正则表达式对你来说足够快吗?