幻影随机停止;访问文档

时间:2016-07-19 14:06:30

标签: javascript web-scraping phantomjs

我使用以下代码为PhantomJS重新创建了我的错误(Windows 10,2.1.1)

var page = require('webpage').create();
page.open('http://phantomjs.org/', function (status) {
    var doc = page.evaluate(function () {
        return document;
    });
    var extractor = function (title) {
        console.log("extractor:called with title = " + title)
        var a = doc.getElementById(title);
        var z = a.childNodes[3].childNodes[1].childNodes[0];
        console.log("z: " + z);
    };
    extractor("feature-01");
    phantom.exit();
});

我很确定这与我正在创建一个在页面上下文中进行求值的函数以创建对'document'的引用这一事实有关,我可以将它与单独定义的JS函数一起使用。

1 个答案:

答案 0 :(得分:2)

是的,这是关于页面上下文的正确预感。你必须对页面进行所有操作。 page.evaluate()函数内部的DOM,因为本机对象不能传入和传出沙盒页面上下文,只能传递原始对象:

  

evaluate函数的参数和返回值必须是一个简单的原始对象。经验法则:如果它可以通过JSON序列化,那就没关系了。

     

闭包,函数,DOM节点等不起作用!

     

来自http://phantomjs.org/api/webpage/method/evaluate.html

你脚本的修改版本将接近这个:

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

// We want to receive console messages from the page context
page.onConsoleMessage = function(msg, lineNum, sourceId) {
    console.log('CONSOLE: ' + msg);
};

page.open('http://phantomjs.org/', function (status) {

    var feature1 = page.evaluate(function () {

        var extractor = function (title) {
            console.log("extractor:called with title = " + title)
            return document.getElementById(title).childNodes[3].childNodes[1].childNodes[0].textContent.trim();
        };
        return extractor("feature-01");
    });

    console.log(feature1);
    phantom.exit();
});