Кукольник не может получить полный исходный код - PullRequest
2 голосов
/ 05 мая 2019

Я создаю простое приложение для очистки с помощью Node.js и Puppeteer . Страница, которую я пытаюсь почистить, это это . Ниже приведен код, который я сейчас использую.

const url = `https://www.betrebels.gr/el/sports?catids=122,40,87,28,45,2&champids=423,274616,1496978,1484069,1484383,465990,465991,91,71,287,488038,488076,488075,1483480,201,2,367,38,1481454,18,226,440,441,442,443,444,445,446,447,448,449,451,452,453,456,457,458,459,460,278261&datefilter=TodayTomorrow&page=prelive`
await page.goto(url, {waitUntil: 'networkidle2'});
let content: string = await page.content();
await page.screenshot({path: 'page.png',fullPage: true});
await fs.writeFile("temp.html", content);
//...Analyze the html and other stuff.

Снимок экрана, который я получаю: это , чего я и ожидаю.

С другой стороны, содержимое страницы минимально и не соответствует данным на изображении.

Я что-то не так делаю? Я не жду, пока Javascript завершит работу?

enter image description here

1 Ответ

2 голосов
/ 05 мая 2019

На странице используются фреймы. Вы видите только основное содержание страницы (без содержимого фреймов). Чтобы также получить содержимое фрейма, сначала нужно найти фрейм (например, через page.$), а затем получить дескриптор его фрейма через elementHandle.contentFrame. Затем вы можете позвонить frame.content(), чтобы получить содержимое кадра.

Простой пример

const frameElementHandle = await page.$('#selector iframe');
const frame = await frameElementHandle.contentFrame();
const frameContent = await frame.content();

В зависимости от структуры страницы, вам нужно сделать это для нескольких фреймов, чтобы получить все содержимое, или вам даже нужно сделать это для фрейма внутри фрейма (что, похоже, имеет место для данной страницы).

Пример для чтения всего содержимого кадра

Ниже приведен пример, который рекурсивно читает содержимое всех фреймов на странице.

const contents = [];
async function extractFrameContents(pageOrFrame) {
  const frames = await pageOrFrame.$$('iframe');
  for (let frameElement of frames) {
    const frame = await frameElement.contentFrame();
    const frameContent = await frame.content();

    // do something with the content, example:
    contents.push(frameContent);

    // recursively repeat
    await extractFrameContents(frame); 
  }
}
await extractFrameContents(page);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...