如何使用Cheerio js移除<div>和<br>标签?

11

我有以下的html内容,希望通过Cheerio进行解析。

    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个回答

15

比看起来容易,首先需要迭代所有DIV。

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

对于每个 <div> 元素,检查它是否含有 <br> 标签。

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

如果是这样,您需要移除该属性

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

如果没有,您需要创建一份具有相同内容的P

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

然后只需将 DIV 替换为 P 即可

$(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());

嗨@adeneo非常感谢! 您的解决方案非常好。如果我只想在句子中添加<p>句子</p>,而在删除“clear”后保留<br>,您会如何建议呢?附上一个图像链接,希望能更清楚地表达我的问题:D image - bosslee
@bosslee - 我不太确定你的意思是什么? - adeneo
1
所以,如果 DIV 元素包含 BR 元素,您希望保留 DIV 元素,只删除属性? - adeneo
非常感谢您的帮助!没有您的帮忙,我不可能能够理清代码。我已经成功得到了期望的结果。再次感谢。 - bosslee
1
我认为你想要做的是 -> **http://jsfiddle.net/ko5dcsko/1/**,但请注意,带有文本“这是测试服务器”的元素是H1。 - adeneo
显示剩余4条评论

2

您不希望删除属性,而是希望删除标签,因此您需要将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()
})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接