从HTML中提取链接的C#HTMLAgilityPack与正则表达式

从HTML中提取链接的C#HTMLAgilityPack与正则表达式,c#,regex,html-parsing,html-agility-pack,C#,Regex,Html Parsing,Html Agility Pack,我正在编写一个C#web爬虫程序,当我运行评测时,我可以看到HTMLAgilityPack的LoadHTML方法使用了程序总CPU使用量的10%。我想试着降低这个 我相信正则表达式会更快,但当我在上查看链接提取示例时,我看到每个人都说应该避免使用这种方法,而使用像HTMLAgilityPack这样的html解析器 我所需要做的就是从HTML中提取链接,是否使用HTMLAgilityPackoverkill 支持HTML解析器的原因是否适用于我的情况,因为我只使用它来提取链接 下载的HTML与W

我正在编写一个C#web爬虫程序,当我运行评测时,我可以看到
HTMLAgilityPack的LoadHTML
方法使用了程序总CPU使用量的10%。我想试着降低这个

我相信正则表达式会更快,但当我在上查看链接提取示例时,我看到每个人都说应该避免使用这种方法,而使用像
HTMLAgilityPack
这样的html解析器

我所需要做的就是从HTML中提取链接,是否使用
HTMLAgilityPack
overkill

支持HTML解析器的原因是否适用于我的情况,因为我只使用它来提取链接


下载的HTML与WebClient进行比较

使用
href\\s*=\\s*(?:[\''](?[^\']*)[\'].[\']|(?\\s+)
(然后修剪并添加到列表中)比HTMLAGILITAPACK快得多

43毫秒,而3毫秒


请参阅上的我的代码

支持HTML解析器的原因是否适用于我的情况,因为我只使用它来提取链接

在您的例子中,HTML解析器是过度的,正如您的测试所示

如果你真的需要以一种更健壮的方式解析HTML域,你应该使用这个工具


对正则表达式的偏见是那些觉得正则表达式太慢或太麻烦[无法学习]的人发现的在某些操作中,他们提出了一些优点,在特定的优化文本中,查找实用程序的性能确实更好。当然,我同意,但是要取消正则表达式,这对于StAcExpLoad的过程来说是标准的。

原因是什么?有时分析是有缺陷的,因为所提供的模式引入了许多不必要的回溯,并且没有优化。这阻碍了regex的发展。人们必须学习regex语言并理解它在做什么来调整regex的引擎以避免污染

对于示例,我采用了与您相同的C#代码测试,但我使用了您和我自己的优化模式,并且能够将其持续降低到1毫秒

大多数人通过使用
*
进行搜索来学习基本的模式匹配。当他们第一次学习regex时,他们使用
*
*
进行匹配。这一步加上不分青红皂白地使用
*
很可能会让任何非开始模式陷入回溯和缓慢响应的地狱

除非根据经验知道没有项目,否则请使用
+



早在2009年,我就在我的博客上写过关于这个主题的文章

HtmlAgilityPack
仍然比使用
RE
要好。如果是关于提取URL,正则表达式很好。你至少应该展示一下如何提取URLlinks@Adeel你能详细说明为什么吗?对于这个场景,如果可能的话:-)使你的模式更容易呃,对于
使用
\x22
的十六进制代码,对于单引号
使用\x27的十六进制代码。这避免了为C#编译器转义模式的麻烦。