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

时间:2017-04-28 10:13:57

标签: c# regex html-parsing html-agility-pack

我正在编写一个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

上查看我的代码

1 个答案:

答案 0 :(得分:2)

  

赞成HTML解析器的原因是否适用于我的案例,因为我只是用它来提取链接?

在您的情况下,HTML解析器在测试显示时过度杀伤。

回答SO的人使用它作为死记硬背回答所有正则表达式问题。如果实际上需要以更健壮的方式解析HTML的域,则应该使用该工具。

对于正则表达式的

偏见是由那些觉得它们太慢或太麻烦[学习]的人发现的。对于某些操作,它们提出的内容有一些优点,因为用于查找实用程序的特定优化文本确实表现更好。当然我同意,但是要解除正则表达式,这对于StackOverflow的课程来说是相同的。

为什么是这样的?有时分析只是有缺陷,因为提供的模式引入了大量不必要的回溯并且未进行优化。这使得正则表达式失败了。人们必须学习正则表达式语言并理解它正在做什么来调整正则表达式的引擎以防止污染。

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

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

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

早在2009年,我就在我的博客上发表了关于这个主题的文章Are C# .Net Regular Expressions Fast Enough for You?