如何删除<div>和使用Cheerio js?</div>

时间:2015-03-01 05:29:43

标签: javascript node.js cheerio

我有以下html,我想通过Cheerios解析。

    var $ = cheerio.load('<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div>This works well.</div><div><br clear="none"/></div><div>So I have been doing this for several hours. How come the space does not split? Thinking that this could be an issue.</div><div>Testing next paragraph.</div><div><br clear="none"/></div><div>Im testing with another post. This post should work.</div><div><br clear="none"/></div><h1>This is for test server.</h1></body></html>', {
    normalizeWhitespace: true,
});

// trying to parse the html
// the goals are to 
// 1. remove all the 'div'
// 2. clean up <br clear="none"/> into <br>
// 3. Have all the new 'empty' element added with 'p'

var testData = $('div').map(function(i, elem) {
    var test = $(elem)
    if ($(elem).has('br')) {
        console.log('spaceme');
        var test2 = $(elem).removeAttr('br');
    } else {
        var test2 = $(elem).removeAttr('div').add('p');
    }
    console.log(i +' '+ test2.html());
    return test2.html()
})

res.send(test2.html())

我的最终目标是尝试解析html

  • 删除所有div
  • 清理<br clear="none"/>并更改为<br>
  • 最后将所有空的'element'(带有'div'的句子)删除,添加'p'句子'/ p'

我尝试在上面编写的代码中以较小的目标开始。我试图删除所有'div'(这是成功的)但我无法找到'br。我一直在尝试几天,没有头脑。

所以我写这篇文章是为了寻求一些帮助,并提示如何实现我的最终目标。

谢谢:D

2 个答案:

答案 0 :(得分:8)

比看起来容易,首先你遍历所有的DIV&#39>

$('div').each(function() { ...

并为每个div检查它是否有<br>标记

$(this).find('br').length

如果是,则删除属性

$(this).find('br').removeAttr('clear');

如果不是,则创建具有相同内容的P

var p = $('<p>' + $(this).html() + '</p>');

然后只需用P

替换DIV
$(this).replaceWith(p);

和输出

res.send($.html());

所有人一起

$('div').each(function() {
    if ( $(this).find('br').length ) {
        $(this).find('br').removeAttr('clear');
    } else {
        var p = $('<p>' + $(this).html() + '</p>');
        $(this).replaceWith(p);
    }
});

res.send($.html());

答案 1 :(得分:0)

您不想删除要删除标记的属性,因此您希望将removeAttr切换为remove,如下所示:

var testData = $('div').map(function(i, elem) {
    var test = $(elem)
    if ($(elem).has('br')) {
        console.log('spaceme');
        var test2 = $(elem).remove('br');
    } else {
        var test2 = $(elem).remove('div').add('p');
    }
    console.log(i +' '+ test2.html());
    return test2.html()
})