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