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

How do I parse a HTML page with Node.js

提问人:Itay Moav -Malimovka 提问时间:9/11/2011 最后编辑:Yves M.Itay Moav -Malimovka 更新时间:11/6/2023 访问量:166576

问:

我需要解析(服务器端)大量的HTML页面。
我们都同意正则表达式不是要走的路。
在我看来,javascript 是解析 HTML 页面的原生方式,但这种假设依赖于服务器端代码具有 javascript 在浏览器中具有的所有 DOM 功能。

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

节点 .js HTML 解析 服务器端

评论


答:

107赞 kzh 9/11/2011 #1

您可以使用 npm 模块 jsdomhtmlparser 在 Node.JS 中创建和解析 DOM。

其他选项包括:

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

评论

3赞 kzh 9/11/2011
你说的好是什么意思?可靠、快速、简单?有了这两个,它就足够强大了,如果你愿意,你可以使用jQuery服务器端
1赞 Itay Moav -Malimovka 9/11/2011
@kzh 对我来说,可靠和简单比过程在一小时或一天内结束更重要。
0赞 kzh 9/12/2011
我想说的是,节点选项是可靠的,如果您已经习惯了 DOM,这绝对很容易。
0赞 cburgmer 9/17/2012
如果你拍摄htmlparser,请先尝试使用 github.com/fb55/node-htmlparser。它似乎是一个重新设计的版本,并且得到了更积极的维护。
0赞 songyy 5/17/2013
我在互联网上搜索了所有内容,但找不到htmlparser的好教程。
6赞 esp 4/21/2013 #2

FB55 的 Htmlparser2 似乎是一个不错的选择。

评论

4赞 polkovnikov.ph 9/22/2014
应该如何处理这种返回格式?写一堆 for 循环和树遍历?
0赞 Phil 5/5/2015
您可以注册以打开/关闭标签事件,因此根据您的需求,恕我直言,这是一个非常好的替代方案。
0赞 esp 5/5/2015
@polkovnikov.ph 还有同一作者的 domutils 包,它使用 htmlparser2 返回的格式 - 它有很多方法,其中一些与 DOM 方法具有相同的语法,有些则不同;您实际上不需要手动遍历对象。那里没有文档,但源代码非常清晰 - 一切都如您所料。
0赞 esp 5/9/2015
还没有,但是什么阻止了你扩展它?使用它已经拥有的功能并不难。
2赞 Yarek T 8/24/2013 #3

JSDOM 太严格了,无法做任何真正的屏幕抓取之类的事情,但 BeautifulSoup 不会因为糟糕的标记而窒息。

node-soupselect 是 Python 的 beautifulsoup 移植到 nodejs 中,它运行得很漂亮

69赞 Meekohi 11/13/2013 #4

使用 Cheerio。它不像 jsdom 那样严格,并且针对抓取进行了优化。作为奖励,使用您已经知道的jQuery选择器。

❤ 熟悉的语法:Cheerio 实现了核心 jQuery 的子集。再见 从 jQuery 中删除所有 DOM 不一致和浏览器问题 库,揭示了其真正华丽的 API。

ϟ 极快的速度:Cheerio 使用非常简单、一致的 DOM 型。因此,解析、操作和渲染令人难以置信 有效。初步的端到端基准表明,cheerio 是 比 JSDOM 快 8 倍左右。

❁ 疯狂的灵活性:Cheerio 包裹着@FB55的宽容 html解析器。Cheerio 几乎可以解析任何 HTML 或 XML 文档。

评论

10赞 polkovnikov.ph 9/22/2014
但不构建 DOM,也不允许 XPath。jQuery 语法肯定是该库的缺点。
2赞 Meekohi 9/22/2014
@polkovnikov.ph 根据我的经验,很少有应用程序需要完整的 DOM 解析,与 jQuery/Cheerio 中的快速“懒惰”评估相比,构建 DOM 非常昂贵。从这个意义上说,jQuery 风格的解析是一个好处,但如果你的应用程序需要操作 DOM 服务器端,你可能更愿意尝试 jsdom。
0赞 polkovnikov.ph 9/22/2014
jsdom太慢了:/
2赞 Meekohi 2/4/2016
@MohamedMansour值得一提的是,我们在生产中使用 Cheerio,并在几秒钟内抓取数千页。当然,“快”和“慢”都与您的应用程序和带宽有关。
0赞 Jonas Sourlier 12/16/2019
非严格:+1。jQuery 语法:+1。
13赞 Anderson Madeira 11/28/2014 #5

使用 htmlparser2,它的方式更快且非常简单。请参阅以下用法示例:

https://www.npmjs.org/package/htmlparser2#usage

现场演示在这里:

http://demos.forbeslindesay.co.uk/htmlparser2/

评论

0赞 Penguin9 10/21/2017
如何获得本演示中得到的确切输出类型?
20赞 Rotem jackoby 11/18/2020 #6

2020 年 11 月更新

我搜索了顶级的 NodeJS html 解析器库。

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

我所说的稳定性是指我希望社区使用库足够长的时间,以便发现错误,并且它仍将得到维护,并且未解决的问题将被关闭。

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

我根据上次提交分为 2 组(每组的顺序是根据 Github 开始):

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

jsdom - . Last commit: 3 Months, Open issues: 331, Github stars: 14.9K

htmlparser2 - . Last commit: 8 days, Open issues: 2, Github stars: 2.7K

parse5 - . Last commit: 2 Months, Open issues: 21, Github stars: 2.5K

swagger-parser - . Last commit: 2 Months, Open issues: 48, Github stars: 663

html-parse-stringify - .Last commit: 4 Months, Open issues: 3, Github stars: 215

node-html-parser - . Last commit: 7 days, Open issues: 15, Github stars: 205

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

切里奥 - . Last commit: 1 year, Open issues: 174, Github stars: 22.9K

koa-bodyparser - . Last commit: 6 months, Open issues: 9, Github stars: 1.1K

萨克斯-JS- Last commit: 3 Years, Open issues: 65, Github stars: 941

draftjs-to-html - . Last commit: 1 Year, Open issues: 27, Github stars: 233


我选择了 Node-html-parser,因为它此刻看起来很安静、快速且非常活跃。

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

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

评论

1赞 moodboom 3/3/2023
我喜欢这个答案,因为它突出了节点开发人员必须经历的不可避免的过程,以审查大量可用的近乎重复的模块。这是我所做的 2023 年调查。唯一不变的是变化。