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

met*_*ate 13 javascript screen-scraping node.js

我知道之前已经问过这个问题,但我找不到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
        });
    });
Run Code Online (Sandbox Code Playgroud)

我试过phantom.js但是找不到一种方法来获取纯文本.

hgo*_*ebl 8

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

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

(这不是使用jsdom和节点测试的,仅在Chrome中测试)

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


Bra*_*rad 7

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

JSDOM.fragment(sourceHtml).textContent
Run Code Online (Sandbox Code Playgroud)


Poy*_*man 7

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

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, ' ')
);
Run Code Online (Sandbox Code Playgroud)