2

我正在尝试将一些数据从一个已处理的网页复制到我要导出的新网页中。背景是我需要抓取页面的一部分,并且需要用原始页面的一部分构建一个新页面。问题似乎是 phantomJs includeJs() 和 evaluate() 方法是沙盒的,我看不到将DOM 从一个页面导入另一个页面的正确方法。

我有一些看起来像这样的测试代码,页面是原始页面并且是新页面:

    ....
    var title = page.evaluate(function() {
        return title = document.getElementById('fooo').innerHTML;
    });
    console.log('page title:' + title);
    //fs.write('c:/Temp/title.js', "var title = '" + title + "';", 'w');

    var out = new WebPage;
    out.viewportSize = page.viewportSize;
    out.content = '<html><head></head><body><div id="wrapper"></div><p>done</p></body></html>';
    out.includeJs('c:/Temp/title.js', function() {
        var p = document.createElement('p');
        p.appendChild(document.createTextNode(title));
        document.getElementById('wrapper').appendChild(p);
    });
    ...
4

1 回答 1

3

您在此处最后一次调用中的函数includeJs将不起作用 - 正如您所注意到的,它是沙盒化的,这意味着闭包将不起作用,因此title不会被定义。将变量传递给的方法page.evaluate称为功能请求,但从 PhantomJS v.1.4.1 开始不可用。

我解决这个问题的一般方法是使用Function构造函数,它允许您使用字符串创建函数:

var myVar = {some:"values", I:"want to pass into my page"},
    test = new Function("window.myVar = " + JSON.stringify(myVar));
page.evaluate(test);

现在您可以evaluate使用与您拥有的功能类似的功能,myVar在沙箱中进行引用,并且您的数据将在客户端范围内可用。

于 2012-01-08T22:02:59.563 回答