如何使用PhantomJS渲染页面的一部分?

时间:2012-08-11 19:33:04

标签: javascript phantomjs

我想使用Phantom.JS将各个HTML元素渲染到PNG中。有谁知道这是否可能?另外,我如何使用Phantom.js呈现用户已经在查看的页面?

5 个答案:

答案 0 :(得分:50)

要仅渲染页面的一部分,您需要为页面设置clipRect属性,然后再渲染它。

var clipRect = document.querySelector(selector).getBoundingClientRect();
page.clipRect = {
    top:    clipRect.top,
    left:   clipRect.left,
    width:  clipRect.width,
    height: clipRect.height
};
page.render('capture.png');

我不明白你问题的第二部分。 Phantom.js无头,意味着没有用户正在看的实际显示。

答案 1 :(得分:22)

工作示例。

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

page.open('http://google.com', function() {
  // being the actual size of the headless browser
  page.viewportSize = { width: 1440, height: 900 };

  var clipRect = page.evaluate(function(){
    return document.querySelector('#hplogo').getBoundingClientRect();
  });

  page.clipRect = {
    top:    clipRect.top,
    left:   clipRect.left,
    width:  clipRect.width,
    height: clipRect.height
  };

  page.render('google.png');
  phantom.exit();
});

答案 2 :(得分:5)

您可以使用CasperJS,这是另一个基于PhantomJS的项目。

casper.start('http://www.weather.com/', function() {
    this.captureSelector('weather.png', '#wx-main');
});

casper.run();

答案 3 :(得分:0)

以下解决方案对我有用。

    var clipRect = document.querySelector(selector).getBoundingClientRect();
     page.clipRect = {
              top:    clipRect.top,
              left:   clipRect.left,
              width:  clipRect.width,
              height: clipRect.height
      };
   page.render('capture.png');

但是我注意到只有当我们渲染的图像不是pdf时才会起作用。 要想知道这个pdf,试试这个

page.evaluate(function (element){
    $(element).appendTo('body');
    $('body > :not(' + element + ')').hide(); 
   }, element);       
  });

window.setTimeout(function(){
    page.render("page.pdf");
  },1000);

此链接可能有所帮助: legal integer length

How to hide all elements except one using jquery?

答案 4 :(得分:-5)

我有同样的需要,我试过这个,它对我来说很好用:

不要忘记网址中的http://www

var page = require('webpage').create();
page.open('YourPageURL', function (status) {

if (status !== 'success') {
    console.log('Network Problem');
} else {
    var p = page.evaluate(function () {
        return document.getElementById('yourDivID').innerHTML
    });
    console.log(p);
}
phantom.exit();
});