JSDOM: dom.window.document.inner HTML не определено - PullRequest
2 голосов
/ 21 января 2020

Я создаю сценарий node.js для анализа содержимого с веб-сайта. Прежде чем работать с возвращенным HTML, я хочу удалить несколько элементов и свойств. Однако, когда я пытаюсь получить HTML из jsdom, мне возвращается только undefined. Это происходит, прежде чем я сделаю свои изменения в HTML. Как я могу использовать jsdom, чтобы изменить HTML и вернуть его?

const jsdom = require('jsdom');
...
var htmlString = `<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html lang=en><head>...`
paresHTML(htmlString);

function parseHTML(htmlString) {
    const dom = new jsdom.JSDOM(htmlString);

    console.log(dom.window.document.innerHTML); // This returns undefined

    dom.window.document.querySelectorAll('script').forEach(element => element.remove());
    dom.window.document.querySelectorAll('head').forEach(element => element.remove());
    dom.window.document.querySelectorAll('link').forEach(element => element.remove());
    dom.window.document.querySelectorAll('style').forEach(element => element.remove());
    dom.window.document.querySelectorAll('iframe').forEach(element => element.remove());

    dom.window.document.querySelectorAll('noscript').forEach((element) => {
        var replacement = dom.window.document.createElement('div');
        replacement.setAttribute('class', 'noscript');
        replacement.innerHTML = element.innerHTML;
        element.parentNode.replaceChild(replacement, element);
    });

    dom.window.document.querySelectorAll('img[src]').forEach((element) => {
        const src = element.getAttribute('src');
        element.setAttribute('data-src', src);
        element.removeAttribute('src');
    });

    dom.window.document.querySelectorAll('[style]').forEach((element) => {
        element.removeAttribute('style');
    });

    return dom.window.document.innerHTML; // This also returns undefined
}

1 Ответ

1 голос
/ 21 января 2020

Как и во внешнем интерфейсе, document не имеет свойства innerHTML:

console.log(document.innerHTML);

Однако, у document.documentElement есть:

console.log(document.documentElement.innerHTML);

JSDom работает так же. Добавление .documentElement к document доступам, например,

console.log(dom.window.document.documentElement.innerHTML);

, приводит к:

<head></head><body>...</body>
...