So, ein wenig gebastelt. Ergebnis: mit Attributen o.ä. scheitert :empty. Unabhängig davon, daß das Auftauchen von TextNodes, scheinbar durch das Löschen von Elementen als temporäre Leichen verbleibend, doch irritierend ist:
'use strict';
(
function() {
const theBody = new DocumentFragment();
for (const mains of document.getElementsByTagName('main')) {
theBody.append(...mains.childNodes);
}
{
const killer = document.createNodeIterator(
theBody,
NodeFilter.SHOW_ELEMENT,
x => /^(?:img|script|style|iframe|form)$/i.test(x.nodeName)
? NodeFilter.FILTER_ACCEPT
: NodeFilter.FLITER_SKIP
);
while (killer.nextNode()) killer.referenceNode.remove();
}
{
const cWalker = document.createNodeIterator(
theBody,
NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT
);
while (cWalker.nextNode()) {
const x = cWalker.referenceNode;
switch (x.nodeType) {
case Node.TEXT_NODE: {
const s = x.textContent.trim();
if (s.length) { x.textContent = s; break; }
// falls through
}
case Node.COMMENT_NODE:
x.remove();
break;
default:
console.log(x.nodeType);
}
}
/*!*/ theBody.normalize(); // egal, ob mit oder ohne das!
const empties = theBody.querySelectorAll(':empty');
for (const empty of empties) empty.remove();
}
document.body.replaceChildren(theBody);
}
)();
als User-Script mit Tampermonkey (jetzt mal auf // @match https://www.westlotto.de/lotto-6aus49/gewinnzahlen/*angesetzt) eingesetzt, läßt die roten Rechtecke immer noch stehen. Nur wenn das hier weggelassene Entfernen von Attributen und Klassen durchgezogen wird, paßt das „Empty-Ergebnis“.
Werd’ noch etwas herumstochern um herauszufinden, was entfernt werden muß und was nur kann, denn etwas von dem Zeug wäre schon hilfreich — oder ich werte es vorher entsprechend aus.