Javascript HTML未进入节点js Puppeter
错误 无法读取null的属性“querySelectorAll” 当我在控制台中写下下面几行时,它会给我HTML。但是当我从Puppeter中刮取HTML时,它给了我错误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]
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,如果你用谷歌搜索它,有一个官方规范。我是如何在兄弟行中应用循环并存储在对象中的。因为它会产生错误