HTML не попасть node js кукольник - PullRequest
       104

HTML не попасть node js кукольник

2 голосов
/ 05 августа 2020

Ошибка

Невозможно прочитать свойство querySelectorAll из null

Я очищаю этот сайт , когда пишу следующие строки в консоли это дает мне HTML. Но когда я очищаю HTML от кукловода, это дает мне ошибку

document.querySelectorAll('#stroke-play-container > .stroke-play-leaderboard > .the-leaderboard.with-rolex > table.leaderboard.leaderboard-table.large')[0].nextSibling;

Код

'use strict';

 const puppeteer = require('puppeteer');
 function run() {
 return new Promise(async (resolve, reject) => {
    try {


        const browser = await puppeteer.launch({
        headless : false
        });

        const page = await browser.newPage();

        await page.goto("https://www.pgatour.com/leaderboard.html");

        await page.evaluate(`window.scrollTo(0, document.body.scrollHeight)`);
        await page.waitFor(5000);
    
        let urls = await page.evaluateHandle(() => {
            let results = [];
            var parser = new DOMParser();
            
            var node = document.querySelectorAll('#stroke-play-container > .stroke-play-leaderboard > .the-leaderboard.with-rolex > table.leaderboard.leaderboard-table.large')[0].nextSibling;
           
            if(node){

            var $ = parser.parseFromString(node, 'text/html');
            
          
            return {
                name: $.querySelectorAll('table > tbody:nth-child(1) > tr > td.player-name > div > div.player-name-col').innerText
            };
            }
            else{
                return 'error';
            }

        })
        browser.close();
        return resolve(urls);
    } catch (e) {
        return reject(e);
    }
})
}
 run().then(console.log).catch(console.error);

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Попробуйте вот так:

let names = await page.evaluate(() => {
  let css = '.the-leaderboard.with-rolex > table.leaderboard.leaderboard-table.large + div div.player-name-col'
  let divs = [...document.querySelectorAll(css)]
  return divs.map(div => div.innerText)
})

Я не уверен, что вы пытались достичь sh с помощью DOMParser, вам никогда не нужно это использовать.

0 голосов
/ 05 августа 2020

РЕДАКТИРОВАТЬ: как указано в комментариях, помните о Условиях обслуживания pgatours.com, которые не допускают парсинга, сканирования и т. Д. c. Приведенное ниже решение предназначено только для того, чтобы проиллюстрировать, как решить общую техническую проблему c, стоящую за вашим вопросом.

Я думаю, что это может быть связано с размером окна просмотра по умолчанию, который использует Puppeteer. Веб-сайт скрывает контент, который вы ищете при меньшем разрешении, отсюда и проблема.

Эта работа заставила меня явно указать размер области просмотра, например:

page.setViewport({ width: 1200, height: 1000 })

Итак ваш код станет:

'use strict';

 const puppeteer = require('puppeteer');
 function run() {
 return new Promise(async (resolve, reject) => {
    try {


        const browser = await puppeteer.launch({
        headless : false
        });

        const page = await browser.newPage();
        page.setViewport({ width: 1200, height: 1000 })


        await page.goto("https://www.pgatour.com/leaderboard.html");

        await page.evaluate(`window.scrollTo(0, document.body.scrollHeight)`);
        await page.waitFor(5000);
    
        let urls = await page.evaluateHandle(() => {
            let results = [];
            var parser = new DOMParser();
            
            var node = document.querySelectorAll('#stroke-play-container > .stroke-play-leaderboard > .the-leaderboard.with-rolex > table.leaderboard.leaderboard-table.large')[0].nextSibling;
           
            if(node){

            var $ = parser.parseFromString(node, 'text/html');
            
          
            return {
                name: $.querySelectorAll('table > tbody:nth-child(1) > tr > td.player-name > div > div.player-name-col').innerText
            };
            }
            else{
                return 'error';
            }

        })
        browser.close();
        return resolve(urls);
    } catch (e) {
        return reject(e);
    }
})
}
run().then(console.log).catch(console.error);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...