【问题标题】:How to convert HTML page to plain text in node.js?如何在 node.js 中将 HTML 页面转换为纯文本?
【发布时间】:2013-11-27 22:28:30
【问题描述】:

我知道之前有人问过这个问题,但我找不到 node.js 的好答案

我需要服务器端从获取的 HTML 页面中提取纯文本(无标签、脚本等)。

我知道如何在客户端使用 jQuery(获取 body 标记的 .text() 内容),但不知道如何在服务器端执行此操作。

我试过https://npmjs.org/package/html-to-text,但这不能处理脚本。

  var htmlToText = require('html-to-text');
    var request = require('request');
    request.get(url, function (error, result) {
        var text = htmlToText.fromString(result.body, {
            wordwrap: 130
        });
    });

我尝试了 phantom.js,但找不到获取纯文本的方法。

【问题讨论】:

    标签: javascript node.js screen-scraping


    【解决方案1】:

    使用 jsdom 和 jQuery(服务器端)。

    使用 jQuery,您可以删除所有脚本、样式、模板等,然后您可以提取文本。

    示例

    (这个没有用jsdom和node测试,只在Chrome中)

    jQuery('script').remove()
    jQuery('noscript').remove()
    jQuery('body').text().replace(/\s{2,9999}/g, ' ')
    

    【讨论】:

    • 如何删除脚本? $.find("script").delete() 生成一个 no-such-method 错误。` jsdom.env({ url: url, scripts: ["code.jquery.com/jquery.js"], done: function (errors, window) { var $ = window.$; $.find( "脚本").delete();`
    • 试试$('script').delete()
    • "TypeError: Object [object Object] has no method 'delete'" 我会将此作为单独的 SO 问题提出。
    • 对不起,.delete 不是正确的方法,它是remove()。但通常您应该首先在浏览器中测试脚本(Chrome 或 FireFox 或 Safari,而不是 MSIE!)。在 Chrome 中,您只需按 Shift+Ctrl+I 即可获取开发者工具。加载页面并在脚本选项卡中测试您的脚本。请注意$ 可能不是jQuery。为了安全起见,请使用jQuery 而不是$。并且注意不要过早删除 jQuery 脚本!
    【解决方案2】:

    对于那些寻找正则表达式解决方案的人,这是我的一个

    const HTMLPartToTextPart = (HTMLPart) => (
      HTMLPart
        .replace(/\n/ig, '')
        .replace(/<style[^>]*>[\s\S]*?<\/style[^>]*>/ig, '')
        .replace(/<head[^>]*>[\s\S]*?<\/head[^>]*>/ig, '')
        .replace(/<script[^>]*>[\s\S]*?<\/script[^>]*>/ig, '')
        .replace(/<\/\s*(?:p|div)>/ig, '\n')
        .replace(/<br[^>]*\/?>/ig, '\n')
        .replace(/<[^>]*>/ig, '')
        .replace('&nbsp;', ' ')
        .replace(/[^\S\r\n][^\S\r\n]+/ig, ' ')
    );
    

    【讨论】:

      【解决方案3】:

      正如另一个答案所建议的,使用 JSDOM,但您不需要 jQuery。试试这个:

      JSDOM.fragment(sourceHtml).textContent
      

      【讨论】:

        【解决方案4】:

        您可以使用 TextVersionJS (http://textversionjs.com) 生成 HTML 字符串的纯文本版本。它是纯 javascript(包含大量 RegExp),因此您可以在浏览器和 node.js 中使用它。

        这个库可以满足您的需要,但它与在浏览器中获取元素的文本相同。其目的是创建 HTML 电子邮件的文本版本。这意味着包括图像之类的东西。例如,给定以下 HTML 和代码 sn-p:

        var textVersion = require("textversionjs");
        var htmlText = "<html>" +
                            "<body>" +
                                "Lorem ipsum <a href=\"http://foo.foo\">dolor</a> sic <strong>amet</strong><br />" +
                                "Lorem ipsum <img src=\"http://foo.jpg\" alt=\"foo\" /> sic <pre>amet</pre>" +
                                "<p>Lorem ipsum dolor <br /> sic amet</p>" +
                                "<script>" +
                                    "alert(\"nothing\");" +
                                "</script>" +
                            "</body>" +
                        "</html>";
        var plainText = textVersion.htmlToPlainText(htmlText);
        

        变量plainText 将包含这个字符串:

        Lorem ipsum [dolor] (http://foo.foo) sic amet
        Lorem ipsum ![foo] (http://foo.jpg) sic amet
        Lorem ipsum dolor
        sic amet
        

        请注意,它确实会正确忽略脚本标签。您可以在 GitHub 上找到最新版本的 source code

        【讨论】:

        • 这似乎创建了 HTML 内容的降价字符串。我注意到它是如何解释带有 hrefalt 的锚点的。
        【解决方案5】:

        为什么不直接获取body标签的textContent呢?

        var body = document.getElementsByTagName('body')[0];
        var bodyText = body.textContent;
        

        【讨论】:

        • 我知道这是一个旧答案,但作为其他人的未来参考,node.js 是一个运行 javascript 的无头服务器,没有文档对象(不使用库并手动创建它)。这个答案似乎假定 js 正在浏览器中运行。
        猜你喜欢
        • 2010-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-12
        • 2014-09-08
        • 2015-10-24
        • 2015-03-23
        相关资源
        最近更新 更多