Не удается получить полностью загруженный html для страницы с помощью puppeteer

#javascript #node.js #web-scraping #puppeteer

#javascript #node.js #веб-очистка #puppeteer

Вопрос:

Я пытаюсь получить полный html для этой страницы. У него есть электронная таблица, которая загружается медленно. Я могу включить электронную таблицу при создании скриншота страницы. Однако я не могу получить html для электронной таблицы. document.body.outerHTML исключает html для электронной таблицы. Как будто puppeteer все еще видит страницу до загрузки электронной таблицы.

Как мне получить полностью загруженный HTML, включая HTML для электронной таблицы?

 
(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();

  await page.goto("http://www.electproject.org/2016g", {
    timeout: 11000,
    waitUntil: "networkidle0",
  });
  await page.setViewport({
    width: 640,
    height: 880,
    deviceScaleFactor: 1,
  });
  await page.screenshot({ path: "buddy-screenshot.png", format: "A4" }); // this screenshot displays the spreadsheet
  let html = await page.evaluate(() => document.body.outerHTML); // this returns the html excluding the spreadsheet
  await browser.close();
})();
  

введите описание изображения здесь

Ответ №1:

Электронная таблица находится в iframe, поэтому сначала вам нужно получить iframe:

 const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();

  await page.goto("http://www.electproject.org/2016g", {
    timeout: 11000,
    waitUntil: "networkidle0",
  });
  await page.setViewport({
    width: 640,
    height: 880,
    deviceScaleFactor: 1,
  });

  const spreadsheetFrame = page.frames().find(
    frame => frame.url().startsWith('https://docs.google.com/spreadsheets/')
  );

  let spreadsheetHead = await spreadsheetFrame.evaluate(
    () => document.body.querySelector('#top-bar').innerText
  );

  console.log(spreadsheetHead); // 2016 November General Election : Turnout Rates

  await browser.close();
})();
  

Комментарии:

1. Спасибо, это приближает меня, потому что я не понимал, что это iframe. Но он по-прежнему просто получает iframe без загрузки данных электронной таблицы, как и раньше. В итоге я просто получил электронную таблицу напрямую. Но мне все еще интересно, можно ли очистить электронную таблицу в iframe, не переходя к связанной электронной таблице.

2. Возможно, вам нужно подождать еще немного с использованием frame.waitForSelector() или frame.waitForFunction() .