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

问题描述 投票:0回答:7

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

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

node.js html-parsing server-side
7个回答
106
投票

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

其他选项包括:

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


68
投票

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

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

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

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


18
投票

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 解析器 -

   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

sax-js -

           Last commit: 3 Years,     Open issues: 65,       Github stars: 941

draftjs 到 html -

    Last commit: 1 Year,      Open issues: 27,       Github stars: 233


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

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

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


13
投票

使用 htmlparser2,它的速度更快而且非常简单。请参阅此用法示例:

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

现场演示在这里:

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


6
投票
FB55 的

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


2
投票

jsdom 过于严格,无法进行任何真正的屏幕抓取之类的事情,但 beautifulsoup 不会因不良标记而窒息。

node-soupselect是python的beautifulsoup到nodejs的端口,它工作得非常漂亮


0
投票

也尝试一下scrape-it,祝你好运!!

© www.soinside.com 2019 - 2024. All rights reserved.