【问题标题】:C# HTMLAgilityPack VS regular expressions for extracting links from HTMLC# HTMLAgilityPack VS 用于从 HTML 中提取链接的正则表达式
【发布时间】:2017-09-26 10:14:21
【问题描述】:

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

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

我需要做的就是从 HTML 中提取链接是使用 HTMLAgilityPack 来杀死吗?

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


然后将下载的 HTML 与 WebClient 进行比较。

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

43 毫秒,而 3 毫秒。


pastebin上查看我的代码

【问题讨论】:

  • HtmlAgilityPack 还是比使用RE
  • 如果是提取URL,正则表达式就可以了。
  • 你至少应该展示你是如何提取链接的
  • @Adeel 你能详细说明为什么吗?如果可能的话,特别针对这种情况:-)
  • 为了使您的模式更简单,请使用十六进制代码\x22 表示",使用\x27 表示单引号'。这避免了为 C# 编译器转义模式的麻烦。

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


【解决方案1】:

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

在您的情况下,正如您的测试所显示的那样,HTML 解析器太过分了。

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


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

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

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

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

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


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

【讨论】:

    猜你喜欢
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 2011-06-05
    • 2011-05-31
    相关资源
    最近更新 更多