Заменить узлы HTML на Cheerio - PullRequest
       9

Заменить узлы HTML на Cheerio

0 голосов
/ 06 октября 2018

Я использую Cheerio JS , чтобы упростить некоторый древний HTML-код и преобразовать его в HTML5.Помимо прочего, я заменяю некоторые кавычки с разметкой, которые выглядят следующим образом:

Заменяемый узел:

<div style="margin:20px; margin-top:5px; ">
    <div class="smallfont" style="margin-bottom:2px">Quote:</div>
    <table cellpadding="6" cellspacing="0" border="0" width="100%">
        <tbody>
            <tr>
                <td class="alt2" style="border:1px solid #999">
                    <div>
                        Originally Posted by <strong>Username</strong>
                    </div>
                    <div style="font-style:italic">Lorem ipsum dolor sit amet</div>
                </td>
            </tr>
        </tbody>
    </table>
</div>

Преобразованный вывод должен выглядеть следующим образом:

<blockquote>Lorem ipsum dolor sit amet</blockquote>

Ниже приведен код текущего кода, который я сейчас использую:

$(`table[id^='post']`).each( (i, el) => {
    // Get the post
    let postBody = $(el).find(`div[id^='post_message_']`).html().trim();

    // Replace quotes with blockquotes
    cheerio.load(postBody)('div[style^="margin:20px; margin-top:5px; "]').each( (i, el) => {
        if ($(el).html().trim().startsWith('<div class="smallfont" style="margin-bottom:2px">Quote')) {
            let tbody = $(el).find('tbody > tr > td').html();
            let quote = $(el).find('tbody > tr > td > div');

            if (quote.html() && quote.text().trim().startsWith('Originally Posted by')) {
                let replacement = $('<blockquote>Hello</blockquote>');
                quote.parent().html().replace(quote.html(), replacement);
            }

            // Looks all good
            console.log($(el).html())
        }

        postBody = $(el).html();
    });
});

И, наконец, дополнительный HTML для некоторого контекста:

<div id="post_message_123456">
    As Username has previously written
    <br>
    <div style="margin:20px; margin-top:5px; ">
        <div class="smallfont" style="margin-bottom:2px">Quote:</div>
        <table cellpadding="6" cellspacing="0" border="0" width="100%">
            <tbody>
                <tr>
                    <td class="alt2" style="border:1px solid #999">

                        <div>
                            Originally Posted by <strong>Username</strong>
                        </div>
                        <div style="font-style:italic">Lorem ipsum dolor sit amet</div>
                    </td>
                </tr>
            </tbody>
        </table>
    </div>
    <br>
    I think he has a point!
    <img src="smile-with-sunglasses.gif" />
</div>

Заменасамо по себе работает, вывод оператора console.log() выглядит все хорошо.Проблема заключается в последней строке, где я пытаюсь заменить оригинальный контент с заменой.Тем не менее, postBody выглядит так, как раньше.Что я делаю не так?

1 Ответ

0 голосов
/ 09 октября 2018

Попробуй так:

let $ = cheerio.load(html)

$('.alt2 div:contains("Originally Posted by")').replaceWith('<blockquote>Lorem ipsum dolor sit amet</blockquote>')

console.log($.html())
...