【问题标题】:copying data from one page to another using phantomJS使用 phantomJS 将数据从一页复制到另一页
【发布时间】:2012-01-06 03:52:49
【问题描述】:

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

【问题讨论】:

    标签: javascript dom web-scraping phantomjs


    【解决方案1】:

    您在此处最后一次调用 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,您的数据将在客户端范围内可用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-03
      • 2021-11-12
      • 2012-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-30
      相关资源
      最近更新 更多