Puppeteer - 按类删除元素

use*_*421 2 javascript node.js puppeteer

我尝试按类名删除元素,但它不起作用.

这是我使用的代码:

await page.screenshot({path: 'pic.png'});   //for testing purposes
    let div_selector_to_remove= ".xj7.Kwh5n";
    var thingToRemove = document.querySelectorAll(div_selector_to_remove);
    var number_of_elements = thingToRemove.length;
    for (var i = 0; i < number_of_elements.length; i++) {
        thingToRemove[i].parentNode.removeChild(thingToRemove);
    }
Run Code Online (Sandbox Code Playgroud)

浏览器加载,我得到加载元素的屏幕截图.什么都没发生.元素仍然存在

Tri*_*wat 12

如何在document.querySelector不写入内容的情况下运行page.evaluate?如果有可能知道.否则这是我的答案版本

await page.goto('<url_here>');
let div_selector_to_remove= ".xj7.Kwh5n";
await page.evaluate((sel) => {
    var elements = document.querySelectorAll(sel);
    for(var i=0; i< elements.length; i++){
        elements[i].parentNode.removeChild(elements[i]);
    }
}, div_selector_to_remove)
Run Code Online (Sandbox Code Playgroud)


ggo*_*len 5

也许更容易...

删除第一个匹配的节点selector

await page.$eval(selector, el => el.remove());
Run Code Online (Sandbox Code Playgroud)

删除所有匹配的节点selector

await page.$$eval(selector, els => els.forEach(el => el.remove()));
Run Code Online (Sandbox Code Playgroud)

等待选择器,然后将其删除:

const el = await page.waitForSelector(selector);
await el.evaluate(el => el.remove());
Run Code Online (Sandbox Code Playgroud)

如果由于某种原因您需要在控制台浏览器中选择并删除:

const selector = ".foo";

// single
await page.evaluate(`
  document.querySelector("${selector}").remove()
`);

// multiple
await page.evaluate(selector =>
  document.querySelectorAll(selector).forEach(el => el.remove()),
  selector
);
Run Code Online (Sandbox Code Playgroud)

您也可以将选择器硬编码到eval字符串/函数中,但我认为以两种不同的方式显示它来自变量会很有用,以防万一。

与 Puppeteer 中的任何内容一样,了解哪些代码在 Node/Puppeteer-land 中运行以及哪些代码在浏览器/控制台-land 中运行非常重要。经验法则是:如果它是回调或字符串化函数体,则它在浏览器中,您只能使用浏览器/DOM 概念,如HTMLElement.remove()windowdocument,否则它在 Node 中运行,您只能调用 Puppeteer API 函数。在 OP 的例子中,看起来我们不在 Node-land 的回调之外,所以这document不是一个东西,只是 Puppeteerpage.函数。