javascript 如何在node.js中将HTML页面转换为纯文本?

9o685dep  于 2023-08-02  发布在  Java
关注(0)|答案(5)|浏览(178)

我知道以前有人问过这个问题,但我找不到node.js的好答案
我需要服务器端提取的纯文本(没有标签,脚本等)从HTML页面是提取。
我知道如何在客户端使用jQuery(获取body标记的.text()内容),但不知道如何在服务器端做到这一点。
我试过https://npmjs.org/package/html-to-text,但它不能处理脚本。

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

字符串
我试过phantom.js,但找不到一种方法来获取纯文本。

iklwldmw

iklwldmw1#

使用jsdom和jQuery(服务器端)。
使用jQuery,你可以删除所有脚本、样式、模板等,然后你可以提取文本。

示例

(This未使用jsdom和node进行测试,仅在Chrome中进行)

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

字符串

ylamdve6

ylamdve62#

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

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, ' ')
);

字符串

w8ntj3qf

w8ntj3qf3#

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

JSDOM.fragment(sourceHtml).textContent

字符串

ha5z0ras

ha5z0ras4#

您可以使用TextVersionJS(http://textversionjs.com)生成HTML字符串的纯文本版本。它是纯JavaScript(有大量的RegExp),所以你可以在浏览器和node.js中使用它。
这个库可以满足你的需要,但是它和在浏览器中获取元素的文本是不一样的。它的目的是创建HTML电子邮件的文本版本。这意味着包括图像等内容。例如,给定以下HTML和代码片段:

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

ebdffaop

ebdffaop5#

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

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

字符串

相关问题