Javascript HTML未进入节点js Puppeter

Javascript HTML未进入节点js Puppeter,javascript,node.js,web-scraping,puppeteer,Javascript,Node.js,Web Scraping,Puppeteer,错误 无法读取null的属性“querySelectorAll” 当我在控制台中写下下面几行时,它会给我HTML。但是当我从Puppeter中刮取HTML时,它给了我错误 document.querySelectorAll('#stroke-play-container > .stroke-play-leaderboard > .the-leaderboard.with-rolex > table.leaderboard.leaderboard-table.large')[0]

错误

无法读取null的属性“querySelectorAll”

当我在控制台中写下下面几行时,它会给我HTML。但是当我从Puppeter中刮取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);

编辑:正如评论中所指出的,请注意pgatours.com的服务条款,其中不允许刮擦、爬行等。 下面的解决方案仅用于说明如何解决问题背后的一般技术点

我认为这可能是因为木偶演员使用的默认视口大小。网站以较小的分辨率隐藏了您要查找的内容,因此出现了问题

对我来说,这样做的原因是明确指定了视口大小,如下所示:

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);

试着这样做:

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)
})

我不确定你想用DOMParser实现什么,你不应该使用它。

你能用evaluate代替evaluateHandle,看看这是否有帮助吗?仍然会出现同样的错误下一步Siblings在ChromiumBy:7中不起作用。行为(b) 您不得通过自动电子流程、机器人、爬行器、刮板器、网络爬虫器或监控、复制或下载PGATOUR.com上或通过PGATOUR.com访问的数据或其他内容的其他计算机程序,包括但不限于实时评分、视频、音频、统计数据等,使用或允许或便利他人使用PGATOUR.com,轮询或数据内容,无论是当前的还是存档的。@Lawrence-该页面是公共的,没有ToS。人们并不一定要签订他们不同意信不信的合同。感谢你们的努力,querySelector在chrome工作。Puppeter launch chromium如果我在chromium中写入相同的查询选择器,则会出现相同的错误“无法读取未定义页面的属性'nextSibling'help@Adam我的错误。请尝试使用setViewport而不是setViewportSize(这是剧作家的语法)来获取下一个兄弟姐妹。table.leadboard.leadboard-table.large在此选择器之后仅选择第一个div。我希望在此选择器表之后获得所有同级。Leadboard.Leadboard-table.large For all Siders替换为~Excellence(Y)。我是如何在Scraping中了解这些符号(+,~)的这只是css,如果你用谷歌搜索它,有一个官方规范。我是如何在兄弟行中应用循环并存储在对象中的。因为它会产生错误