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

C# HTMLAgilityPack VS regular expressions for extracting links from HTML

我正在编写一个 C# 网络爬虫,当我 运行 分析时,我可以看到 HTMLAgilityPack's LoadHTML 方法使用了整个程序 CPU 的 10%。我想尝试降低这个。

我确信正则表达式会更快,但是当我查看 link 提取示例时,我看到每个人都说应该避免使用这种方法,而应该使用 html 解析器,例如 HTMLAgilityPack.

因为我需要做的就是从 HTML 中提取 links 正在使用 HTMLAgilityPack 而不是 kill?

支持 HTML 解析器的原因是否适用于我的情况,因为我仅将其用于提取 links?


用 WebClient 下载 HTML 然后比较。

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

43 毫秒,而一直是 3 毫秒。


pastebin

上查看我的代码

Are the reasons for favouring a HTML parser applicable to my case as I'm only using it for extracting links?

在您的情况下,HTML 解析器如您的测试所示那样杀伤力过大。

回答 SO 的人将其用作对所有正则表达式问题的死记硬背答案。如果确实需要以更稳健的方式解析 HTML 的域,则应该使用该工具。


对正则表达式的偏见 是那些觉得它们 [学习] 太慢或太麻烦的人发现的。他们为某些操作提出的建议有一些优点,因为用于查找实用程序的特定优化文本确实表现更好。当然,我同意,但是为了摆脱正则表达式,这是 Whosebug 上的课程的标准。

为什么是?有时分析只是有缺陷,因为提供的模式引入了很多 不必要的 回溯并且没有优化。这阻碍了正则表达式的发展。确实必须学习正则表达式语言并了解它正在做什么来调整正则表达式引擎以防止污染。

对于示例,我进行了相同的 C# 代码测试,但我使用了你和我自己的优化模式,并且能够始终如一地将它降低到 1 毫秒!

大多数人通过使用 * 进行搜索来学习基本的模式匹配。当他们第一次学习正则表达式时,他们使用 *.,例如 .*。该步骤以及不加区别地使用 * 很可能会使任何非开始模式陷入回溯和缓慢响应的地狱。

除非您凭经验知道没有项目,否则请改用 +


早在 2009 年,我就在我的博客上写过这个主题 Are C# .Net Regular Expressions Fast Enough for You?