【问题标题】:How do I parse a HTML page with Node.js如何使用 Node.js 解析 HTML 页面
【发布时间】:2011-11-14 10:29:25
【问题描述】:

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

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

【问题讨论】:

    标签: node.js html-parsing server-side


    【解决方案1】:

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

    其他选项包括:

    • BeautifulSoup 用于 python
    • 你可以转换你 html to xhtml 并使用 XSLT
    • HTMLAgilityPack 用于 .NET
    • CsQuery 用于 .NET(我的新宠)
    • spidermonkey 和 rhino JS 引擎具有原生 E4X 支持。仅当您将 html 转换为 xhtml 时,这可能很有用。

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

    【讨论】:

    • 好是什么意思?可靠、快速、简单?有了这两个,它足够强大,你可以use jQuery serverside if you wanted to
    • @kzh 可靠和简单对我来说比流程在一小时或一天结束时更重要。
    • 我会说 node 选项是可靠的,如果你已经习惯了 DOM,那绝对是简单的。
    • 如果您为 htmlparser 拍摄,请先尝试使用 github.com/fb55/node-htmlparser。它似乎是一个重新设计的版本,并且维护得更加积极。
    • 我在整个互联网上搜索,但找不到一个好的 htmlparser 教程..
    【解决方案2】:

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

    ❤ 熟悉的语法:Cheerio 实现了核心 jQuery 的一个子集。切里奥 从 jQuery 中删除所有 DOM 不一致和浏览器杂乱无章 库,展示其真正华丽的 API。

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

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

    【讨论】:

    • 但是不构建 DOM 并且不允许 XPath。 jQuery 语法肯定是该库的一个缺点。
    • @polkovnikov.ph 根据我的经验,很少有应用程序需要完整的 DOM 解析,并且与 jQuery/Cheerio 中的快速“惰性”评估相比,构建 DOM 非常昂贵。从这个意义上说,jQuery 风格的解析是一个好处,但是如果您的应用程序需要操作 DOM 服务器端,您可能更愿意尝试 jsdom。
    • jsdom 太慢了:/
    • @MohamedMansour 值得我们在生产中使用 Cheerio 并在几秒钟内抓取数千页。当然,“快”和“慢”都与您的应用程序和带宽有关。
    • 非严格:+1。 jQuery 语法:+1。
    【解决方案3】:

    使用 htmlparser2,它的方式更快、更简单。参考这个用法示例:

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

    还有现场演示:

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

    【讨论】:

    • 如何获得本演示中的确切输出类型?
    【解决方案4】:

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

    【讨论】:

    • 那么this return format应该怎么办?写一堆for循环和树遍历?
    • 您可以注册打开/关闭标签事件,所以这取决于您想要什么,这是一个非常好的替代恕我直言。
    • @polkovnikov.ph 还有同一作者的domutils 包,它使用 htmlparser2 返回的格式 - 它有很多方法,其中一些与 DOM 方法具有相同的语法,一些是不同的;你真的不需要手动遍历对象。那里没有文档,但源代码非常清晰 - 一切都如您所愿。
    • 还没有,但是是什么阻止你扩展它?使用它已有的功能并不难。
    【解决方案5】:

    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 个月及以上:

    cheerio - 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-to-html - Last commit: 1 Year, Open issues: 27, Github stars: 233.


    我选择 Node-html-parser 是因为它现在看起来很安静而且非常活跃。

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

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

    【讨论】:

      【解决方案6】:

      jsdom 太严格了,不能做任何真正的屏幕抓取之类的事情,但 beautifulsoup 不会因标记错误而窒息。

      node-soupselect是python的beautifulsoup到nodejs的一个端口,效果很好

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-18
        • 2010-12-03
        • 1970-01-01
        • 1970-01-01
        • 2014-08-31
        • 2014-11-03
        相关资源
        最近更新 更多