34

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

例子:

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

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

我已经尝试过上述方法,但没有运气....

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

谢谢!

4

5 回答 5

121

很简单,看一下colorwheel.js的例子。

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

就这样!然后您可以操作页面,例如将其渲染为图像。

于 2012-08-02T05:20:13.313 回答
19

为此,您需要将页面内容设置为您的字符串。

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('version', callback)或 page.set('viewportSize', {width:640,height:480}) 等。

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

于 2015-04-06T09:48:59.037 回答
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>
于 2012-07-31T17:48:17.903 回答
2

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

无论如何,它只是工作并且相当快..

于 2013-06-11T22:27:21.843 回答
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");
于 2015-04-06T18:54:59.227 回答