page.evaluate 返回空值但浏览器控制台返回正确值
page.evaluate returning null values but browser console returning correct values
我正在将 Puppeteer 用于网络抓取应用程序。 Page.evaluate 函数正在返回空值。但同样的功能是在浏览器控制台中returns正确的值。
const puppeteer = require('puppeteer');
let scrape = async () => {
const browser = await puppeteer.launch({headless:false});
const page = await browser.newPage();
var ticker = 'DIS';
var my_url = 'https://seekingalpha.com/symbol/' + ticker + '/momentum/moving-averages';
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0');
await page.goto(my_url);
page.on('console', msg => console.log('PAGE LOG:', msg.text()));
const result = await page.evaluate(() => {
const elements = Array.from(document.querySelectorAll('table tr td'));
let links = elements.map(element => {
return element.href
})
console.log(links, 'inside page.evaluate');
return links;
});
browser.close();
return result;
};
scrape().then((value) => {
console.log(value); // Success!
得到以下结果....
PAGE LOG: JSHandle@array inside page.evaluate
[ null, null, null, null, null, null, null, null, null, null ]
在浏览器控制台中,我得到...
document.querySelectorAll('table tr td')
NodeList(10) [ td.left.left-text, td.middle.center-text, td.middle.center-text, td.middle.center-text, td.right.center-text, td.left.left-text, td.middle.center-text.red, td.middle.center-text.green, td.middle.center-text.green, td.right.center-text.green ]
非常感谢任何帮助...
在 Thomas 的建议下,我能够进行以下调整并且现在有效...
sma[0] = await page.$eval('table tr:nth-child(2) td:nth-child(2)', el => {return el.innerHTML });
sma[1] = await page.$eval('table tr:nth-child(2) td:nth-child(3)', el => {return el.innerHTML });
sma[2] = await page.$eval('table tr:nth-child(2) td:nth-child(4)', el => {return el.innerHTML });
sma[3] = await page.$eval('table tr:nth-child(2) td:nth-child(5)', el => {return el.innerHTML });
您的 console.log(links, 'inside page.evaluate')
正在浏览器运行时内执行。任何从浏览器记录或发送到 Node.js 环境的数据都需要是可序列化的(请参阅 docs),而 DOM 元素则不是这种情况。因此显示 null
。
要查询元素,可以使用函数page.$$(selector)。示例:
const tds = await page.$$('table tr td');
虽然浏览器中的代码工作正常。我认为您的实际问题是您的代码正在查询 td
元素,然后尝试将 td
元素映射到它们的 href
值。我假设您可能想要遍历 a
元素。因此,您的选择器可能应该改为 'table tr td a'
。
我正在将 Puppeteer 用于网络抓取应用程序。 Page.evaluate 函数正在返回空值。但同样的功能是在浏览器控制台中returns正确的值。
const puppeteer = require('puppeteer');
let scrape = async () => {
const browser = await puppeteer.launch({headless:false});
const page = await browser.newPage();
var ticker = 'DIS';
var my_url = 'https://seekingalpha.com/symbol/' + ticker + '/momentum/moving-averages';
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0');
await page.goto(my_url);
page.on('console', msg => console.log('PAGE LOG:', msg.text()));
const result = await page.evaluate(() => {
const elements = Array.from(document.querySelectorAll('table tr td'));
let links = elements.map(element => {
return element.href
})
console.log(links, 'inside page.evaluate');
return links;
});
browser.close();
return result;
};
scrape().then((value) => {
console.log(value); // Success!
得到以下结果....
PAGE LOG: JSHandle@array inside page.evaluate
[ null, null, null, null, null, null, null, null, null, null ]
在浏览器控制台中,我得到...
document.querySelectorAll('table tr td')
NodeList(10) [ td.left.left-text, td.middle.center-text, td.middle.center-text, td.middle.center-text, td.right.center-text, td.left.left-text, td.middle.center-text.red, td.middle.center-text.green, td.middle.center-text.green, td.right.center-text.green ]
非常感谢任何帮助...
在 Thomas 的建议下,我能够进行以下调整并且现在有效...
sma[0] = await page.$eval('table tr:nth-child(2) td:nth-child(2)', el => {return el.innerHTML });
sma[1] = await page.$eval('table tr:nth-child(2) td:nth-child(3)', el => {return el.innerHTML });
sma[2] = await page.$eval('table tr:nth-child(2) td:nth-child(4)', el => {return el.innerHTML });
sma[3] = await page.$eval('table tr:nth-child(2) td:nth-child(5)', el => {return el.innerHTML });
您的 console.log(links, 'inside page.evaluate')
正在浏览器运行时内执行。任何从浏览器记录或发送到 Node.js 环境的数据都需要是可序列化的(请参阅 docs),而 DOM 元素则不是这种情况。因此显示 null
。
要查询元素,可以使用函数page.$$(selector)。示例:
const tds = await page.$$('table tr td');
虽然浏览器中的代码工作正常。我认为您的实际问题是您的代码正在查询 td
元素,然后尝试将 td
元素映射到它们的 href
值。我假设您可能想要遍历 a
元素。因此,您的选择器可能应该改为 'table tr td a'
。