node.js \ sanitize html并删除标签

时间:2015-07-26 11:49:11

标签: node.js html-sanitizing

如何告诉"sanitize-html"实际删除html标记(仅保留其中的内容)?目前,如果我将其设置为保留div部分,在输出中它还写入<div>some content</div> - 我只想要内部...('一些内容')

简化 - 我不想要标签,属性等 - 只有这些元素的内容..

var Crawler = require("js-crawler");
    var download = require("url-download");
    var sanitizeHtml = require('sanitize-html');
    var util = require('util');
    var fs = require('fs');

    new Crawler().configure({depth: 1})
      .crawl("http://www.cnn.com", function onSuccess(page) {

        var clean = sanitizeHtml(page.body,{
         allowedTags: [ 'p', 'em', 'strong','div' ],
        });
        console.log(clean);
        fs.writeFile('sanitized.txt', clean, function (err) {
            if (err) throw err;
            console.log('It\'s saved! in same location.');
        });

        console.log(util.inspect(clean, {showHidden: false, depth: null}));
        var str = JSON.stringify(clean.toString());
        console.log(str);
        /*download(page.url, './download')
        .on('close', function () {
          console.log('One file has been downloaded.');
        });*/
      });

1 个答案:

答案 0 :(得分:11)

我是sanitize-html的作者。

您可以将allowedTags设置为空数组。 sanitize-html不会丢弃不允许的标记的内容,只会丢弃标记本身(除了“脚本”和“样式”之类的一些标记,这对此没有意义)。否则它对其最初的预期目的没有多大用处,即清理从文字处理器等复制并粘贴到富文本编辑器中的标记。

但是,如果您有以下标记:

<div>One</div><div>Two</div>

那将是:

ONETWO

要解决此问题,您可以使用textFilter选项确保标记文本后面至少跟一个空格:

textFilter: function(text) {
  return text + ' ';
}

但是,这也会在包含“strong”和“em”等内联标签的句子中引入额外的空格。

所以我想的越多,对你来说最好的答案可能是一个完全不同的npm模块:

https://www.npmjs.com/package/html-to-text

它被广泛使用,并且比您的用例更适合。 sanitize-html真的适用于你想要标签的情况......只是没有错误的标签。