如何使用Node.js解析HTML页面

如何使用Node.js解析HTML页面,node.js,html-parsing,server-side,Node.js,Html Parsing,Server Side,我需要解析(服务器端)大量HTML页面。 我们都同意,regexp不是解决这个问题的方法。 在我看来,javascript是解析HTML页面的本机方式,但这一假设依赖于服务器端代码,它具有javascript在浏览器中的所有DOM功能 Node.js是否内置了这种功能? 有没有更好的方法来解决这个问题,在服务器端解析HTML?您可以使用这些模块并在Node.JS中创建和解析DOM 其他选择包括: 对于python 您可以转换并使用XSLT 对于.NET 对于.NET(我的新宠) spiderm

我需要解析(服务器端)大量HTML页面。
我们都同意,regexp不是解决这个问题的方法。
在我看来,javascript是解析HTML页面的本机方式,但这一假设依赖于服务器端代码,它具有javascript在浏览器中的所有DOM功能

Node.js是否内置了这种功能?
有没有更好的方法来解决这个问题,在服务器端解析HTML?

您可以使用这些模块并在Node.JS中创建和解析DOM

其他选择包括:

  • 对于python
  • 您可以转换并使用XSLT
  • 对于.NET
  • 对于.NET(我的新宠)
  • spidermonkey和rhino JS引擎具有本机E4X支持。只有将html转换为xhtml时,这才可能有用

在所有这些选项中,我更喜欢使用Node.js选项,因为它使用标准的W3CDOM访问器方法,并且我可以在客户端和服务器上重用代码。我希望BeautifulSoup的方法更类似于W3C dom,我认为将HTML转换为XHTML来编写XSLT简直是太残忍了。

由FB55编写似乎是一个不错的选择。

jsdom太严格了,不能做任何真正的屏幕抓取之类的事情,但BeautifulSoup不会被糟糕的标记扼杀

是python的beautifulsoup到NodeJ的一个端口,使用起来非常漂亮。它不像jsdom那样严格,并且针对刮取进行了优化。作为奖励,使用您已经知道的jQuery选择器

❤ 熟悉的语法:ChereIO实现了核心jQuery的一个子集。干杯 从jQuery中删除所有DOM不一致和浏览器错误 库,展示了它真正华丽的API

ϟ极快:Cheerio使用非常简单、一致的DOM 模型因此,解析、操作和渲染非常复杂 有效率的初步的端到端基准表明,ChereIO是 大约比JSDOM快8倍

❁ 疯狂灵活:Cheerio环绕@FB55的宽恕 HTMLPasser。Cheerio几乎可以解析任何HTML或XML文档


使用htmlparser2,它的方式更快、更简单。请参阅此用法示例:

现场演示如下:

2020年11月更新 我搜索了顶级的NodeJS html解析器库

因为我的用例不需要具有许多特性的库,所以我可以关注稳定性和性能

所谓稳定性,我的意思是,我希望社区使用该库的时间足够长,以便发现bug,它仍将得到维护,开放的问题将被关闭

很难理解开源库的未来,但我根据中的前10个库做了一个小总结

我根据最后一次提交分为2个组(每个组的顺序取决于Github启动):

最近一次提交是在过去6个月内:

-
上次提交:3个月,未解决问题:331,Github stars:14.9K

-
最后提交:8天,未解决问题:2,Github stars:2.7K

-
上次提交:2个月,未解决问题:21,Github stars:2.5K

-
上次提交:2个月,未解决问题:48,Github stars:663

-
上次提交:4个月,未解决问题:3,Github stars:215

-
最后提交时间:7天,未解决问题:15天,Github stars:205

上次提交时间为6个月及以上:

-
上次提交:1年,未解决问题:174,Github stars:22.9K

-
上次提交:6个月,未解决问题:9个,Github stars:1.1K

-
上次提交:3年,未解决问题:65,Github stars:941

-
上次提交:1年,未解决问题:27,Github stars:233


我选择了节点html解析器,因为此时它看起来非常安静、快速且非常活跃

(*)Openbase添加了关于每个库的更多信息,如贡献者的数量(提交+3次)、每周下载、每月提交、版本等


(**)上表是根据具体时间和日期的快照-我会再次检查参考资料,作为第一步,检查最近活动的水平,然后深入了解较小的细节。

什么是好?可靠、快速、简单?有了这两个选项,它就足够强大了,因此您可以。@kzh Reliable和easy对我来说更重要,如果进程在一小时或一天内结束。我想说,如果您已经习惯了DOM,那么node选项是可靠的,而且肯定很容易。如果您想要htmlparser,请尝试先使用它。它似乎是一个经过修改的版本,并且维护得更为积极。我在互联网上搜索了所有内容,但没有找到一个好的HTMLPasser教程。但是它不构建DOM,也不允许XPath。jQuery语法肯定是该库的一个缺点。@polkovnikov.ph根据我的经验,很少有应用程序需要完整的DOM解析,与jQuery/Cheerio中的快速“惰性”评估相比,构建DOM的成本非常昂贵。从这个意义上讲,jQuery风格的解析是一个优势,但是如果您的应用程序需要操作DOM服务器端,您可能更愿意尝试jsdom。
jsdom
太慢了:/@MohamedMansour值得一提的是,我们在生产中使用了Cheerio,并在几秒钟内抓取了数千页。“快”和“慢”当然都与您的应用程序和带宽有关。非严格:+1。jQuery语法:+1.那么应该用它做什么呢?编写一组for循环和树遍历?您可以注册打开/关闭标记事件,因此,根据您的需要,这是一个非常好的替代方法imho.@polkovinkov.ph还有一个由同一作者编写的用于forma的包