剥离每个子元素的html

时间:2017-03-07 14:44:03

标签: javascript node.js cheerio

让我说我有像这样的脏HTML ...

let dirty = `
<pre>
    pre tag with <b>html</b>
</pre>
<pre>
    another pre tag with <b>html</b>
</pre>
`

我需要从每个预标记的子项中删除html ...

我这样做......

let $ = cheerio.load(dirty)
$('pre').each(function() {
    let text = $(this).text()
    console.warn(text) // html are stripped
    return `<pre>${text}</pre>`
});
console.log($.html()) // html are not stripped

我错过了什么.. ??

3 个答案:

答案 0 :(得分:2)

首先请注意,虽然您在技术上可以使用反引号来划分多行字符串,但它在IE中完全不受支持,因此无法可靠地使用。您需要使用引号(')或双引号(")代替。

您的逻辑问题是您在每个循环中定义text变量,但不对其执行任何操作,因为从each()返回是多余的。

要解决此问题,您只需使用text()方法从指定元素中去除任何子HTML。试试这个:

&#13;
&#13;
let dirty = '<pre>pre tag with <b>html</b></pre><pre>another pre tag with <b>html</b></pre>';

$('body').append(dirty);
$('pre').text(function(i, t) {
  return t;
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

$('pre').each(function() {
    let text = $(this).text()
    // You need to inject cleaned string into the DOM
    $(this).html(text)
});

console.log($('div').html())
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div>
  <pre>
    pre tag with <b>html</b>
  </pre>
  <pre>
    another pre tag with <b>html</b>
  </pre>
</div>

答案 2 :(得分:1)

您需要实际分配新的html,现在您不必将html设置为其他内容。以下将有效

const cheerio = require("cheerio");
let dirty = `
<pre>
    pre tag with <b>html</b>
</pre>
<pre>
    another pre tag with <b>html</b>
</pre>
`;
let $ = cheerio.load(dirty);
$("pre").each(function() {
    $(this).html($(this).text());
});
console.log($.html());