使用phantomJS将数据从一个页面复制到另一个页面

时间:2012-01-06 03:52:49

标签: javascript dom web-scraping phantomjs

我正在尝试将一些已处理网页中的某些数据复制到我要导出的新网页中。背景是我需要抓取页面的一部分,并需要构建一个包含原始页面部分的新页面。 问题似乎是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);
    });
    ...

1 个答案:

答案 0 :(得分:3)

此处上次includeJs调用中的函数不起作用 - 正如您所说,它是沙盒的,这意味着闭包不起作用,因此将不会定义title。将变量传递给page.evaluate的方法是noted as a feature request,但从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,您的数据将在客户端范围内提供。