2 回答

TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超4個(gè)贊
像這樣嘗試:
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 完成什么,你永遠(yuǎn)不需要使用它。

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超17個(gè)贊
編輯:正如評(píng)論中所指出的,請(qǐng)注意 pgatours.com 的服務(wù)條款,它不允許進(jìn)行抓取、抓取等操作。以下解決方案僅用于說明如何解決您的問題背后的通用技術(shù)點(diǎn).
我認(rèn)為這可能是由于 Puppeteer 使用的默認(rèn)視口大小所致。該網(wǎng)站以較小的分辨率隱藏了您正在尋找的內(nèi)容,因此出現(xiàn)了問題。
使它對(duì)我有用的是明確指定視口大小,如下所示:
page.setViewport({ width: 1200, height: 1000 })
所以你的代碼會(huì)變成:
'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);
添加回答
舉報(bào)