PhantomJS从字符串创建页面

时间:2012-07-31 15:51:00

标签: javascript node.js phantomjs

是否可以从字符串创建页面?

示例:

html = '<html><body>blah blah blah</body></html>'

page.open(html, function(status) {
  // do something
});

我已经尝试了以上但没有运气......

此外,我认为值得一提的是我正在使用带有phantomjs-node的nodejs(https://github.com/sgentle/phantomjs-node)

谢谢!

5 个答案:

答案 0 :(得分:120)

这很简单,请看colorwheel.js示例。

var page = require('webpage').create();
page.content = '<html><body><p>Hello world</p></body></html>';

这就是全部!然后你可以操纵页面,例如将其渲染为图像。

答案 1 :(得分:18)

要执行此操作,您需要将网页内容设置为字符串。

phantom.create(function (ph) {
  ph.createPage(function (page) {
      page.set('viewportSize', {width:1440,height:900})

      //like this
      page.set('content', html);

      page.render(path_to_pdf, function() { 
        //now pdf is written to disk.
        ph.exit();
      });
  });
});

您需要使用page.set()来设置html内容。

根据https://github.com/sgentle/phantomjs-node#functionality-details

  

无法直接获取/设置属性   而是使用 page.get(&#39;版本&#39;,回调)或page.set(&#39; viewportSize&#39;,{width:640,height:480})等。

     

可以通过在键中包含点来访问嵌套对象,例如    page.set(&#39; settings.loadImages&#39;,false)

答案 2 :(得分:2)

查看phantomjs API,page.open需要一个URL作为第一个参数,而不是HTML字符串。这就是你尝试的东西不起作用的原因。

但是,您可能能够实现从字符串创建页面的效果的一种方法是托管一个空的“框架页面”,在某个地方使用URL(可能是localhost),然后包含Javascript(使用includeJs) )进入空白页面。您包含在空白页面中的Javascript可以使用document.write("<p>blah blah blah</p>")动态地向网页添加内容。

我曾经这样做过,但是AFAIK应该可行。

示例骨架页面:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head></head>
<body></body>
</html>

答案 3 :(得分:2)

只是想提一下我最近有类似的需求并发现我可以将file://样式引用作为URL参数传递,因此我将HTML字符串转储到本地文件中,然后将完整路径传递给我的捕获脚本( django_screamshot)它基本上使用casperjs和phantomjs +一个capture.js脚本。

无论如何它只是工作而且速度相当快......

答案 4 :(得分:2)

我在PhantomJS 2.0.0版本中使用了以下内容。以前,我使用page.open()从文件系统打开一个页面并设置一个回调:

page.open("bench.html", pageLoadCallback);

现在,我使用HTML页面从字符串变量完成同样的事情。 page.setContent()方法需要将URL作为第二个参数,并使用fs.absolute()构建 file:// URL。

page.onLoadFinished = pageLoadCallback;
page.setContent(bench_str, "file://" + fs.absolute(".") + "/bench.html");