4

我正在测试 PhantomJS 并尝试返回 angel.co 上列出的所有初创公司。我决定使用 PhantomJS,因为我需要通过单击底部的“下一步”来对首页进行分页。现在这段代码不返回任何结果。我对 PhantomJS 完全陌生,并且已经阅读了所有代码示例,因此非常感谢任何指导。

var page = require('webpage').create();
page.open('https://angel.co/startups', function(status) {
if (status !== 'success') {
    console.log('Unable to access network');
} else {
     page.evaluate(function() {
        var list = document.querySelectorAll('div.resume');
        for (var i = 0; i < list.length; i++){
           console.log((i + 1) + ":" + list[i].innerText);
        }
     });
}
phantom.exit();
});
4

1 回答 1

17

默认情况下,页面上评估的控制台消息不会出现在您的 PhantomJS 控制台中。

当您在 下执行代码时page.evaluate(...),该代码将在页面的上下文中执行。因此,当您拥有console.log((i + 1) + ":" + list[i].innerText);时,就是在无头浏览器本身中登录,而不是在 PhantomJS 中。

如果您希望将所有控制台消息传递给 PhantomJS 本身,请在打开页面后使用以下命令:

page.onConsoleMessage = function (msg) { console.log(msg); };

page.onConsoleMessage每当您从页面内打印到控制台时都会触发。使用此回调,您要求 PhantomJS 将消息回显到其自己的标准输出流。

作为参考,您的最终代码将如下所示(这对我来说成功打印):

var page = require('webpage').create();

page.open('https://angel.co/startups', function(status) {
    page.onConsoleMessage = function (msg) { console.log(msg); };
    if (status !== 'success') {
        console.log('Unable to access network');
    } else {
         page.evaluate(function() {
            var list = document.querySelectorAll('div.resume');
            for (var i = 0; i < list.length; i++){
               console.log((i + 1) + ":" + list[i].innerText);
            }
         });
    }
    phantom.exit();
});
于 2013-08-08T16:35:21.770 回答