phantom - 无法将循环与 page.evaluate 一起使用
phantom - can't use loop with page.evaluate
我正在使用 phantom 6.0.3
抓取网页。这是初始设置:
(async function () {
const instance = await phantom.create(['--ignore-ssl-errors=yes', '--load-images=no', '--web-security=false'], {logLevel: 'error'});
const page = await instance.createPage();
await page.on('onResourceRequested', function (requestData) {
console.info('Requesting', requestData.url);
});
const url = // Some url
const status = await page.open(url);
const content = await page.evaluate(function () {
return document.querySelector('ul > li');
});
const contentLength = content.length // 5
//Code Block 2 goes here
})();
到目前为止一切正常。能够成功判断content
的长度为5
(有5条li
)。所以我现在想做的是获取每个 li
元素的 innerText
...这就是我遇到问题的地方。
我尝试使用 for loop
检索每个 li
元素的 innerText
,但它总是 returns null
。这是我尝试过的:
//Code Block 2:
for (let i = 0; i < contentLength; i++) {
const info = await page.evaluate(function () {
const element = document.querySelector('ul > li');
return element[i].innerText;
});
console.log(info); // this returns null 5 times
}
我不知道发生了什么。我可以给 return 一个特定的索引,例如:return element[3].innerText
,这会给我正确的 innerText
,但我无法通过 loop
PhantomJS 在不同的上下文中评估函数,因此它不知道参数 i
。
您应该将 i
传递给评估函数,以便将其转发给浏览器进程:
for (let i = 0; i < contentLength; i++) {
const info = await page.evaluate(function (index) { // notice index argument
const element = document.querySelector('ul > li');
return element[index].innerText;
}, i); // notice second argument is i
console.log(info);
}
我正在使用 phantom 6.0.3
抓取网页。这是初始设置:
(async function () {
const instance = await phantom.create(['--ignore-ssl-errors=yes', '--load-images=no', '--web-security=false'], {logLevel: 'error'});
const page = await instance.createPage();
await page.on('onResourceRequested', function (requestData) {
console.info('Requesting', requestData.url);
});
const url = // Some url
const status = await page.open(url);
const content = await page.evaluate(function () {
return document.querySelector('ul > li');
});
const contentLength = content.length // 5
//Code Block 2 goes here
})();
到目前为止一切正常。能够成功判断content
的长度为5
(有5条li
)。所以我现在想做的是获取每个 li
元素的 innerText
...这就是我遇到问题的地方。
我尝试使用 for loop
检索每个 li
元素的 innerText
,但它总是 returns null
。这是我尝试过的:
//Code Block 2:
for (let i = 0; i < contentLength; i++) {
const info = await page.evaluate(function () {
const element = document.querySelector('ul > li');
return element[i].innerText;
});
console.log(info); // this returns null 5 times
}
我不知道发生了什么。我可以给 return 一个特定的索引,例如:return element[3].innerText
,这会给我正确的 innerText
,但我无法通过 loop
PhantomJS 在不同的上下文中评估函数,因此它不知道参数 i
。
您应该将 i
传递给评估函数,以便将其转发给浏览器进程:
for (let i = 0; i < contentLength; i++) {
const info = await page.evaluate(function (index) { // notice index argument
const element = document.querySelector('ul > li');
return element[index].innerText;
}, i); // notice second argument is i
console.log(info);
}