PhantomJS создает страницу из строки

Можно ли создать страницу из строки?

пример:

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

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

Я уже пробовал вышеизложенное без везения....

Кроме того, я думаю, стоит упомянуть, что я использую nodejs с phantomjs-node (https://github.com/sgentle/phantomjs-node)

Спасибо!


person mike    schedule 31.07.2012    source источник


Ответы (5)


Глядя на phantomjs API, page.open требует URL в качестве первого аргумента, не строка HTML. Вот почему то, что вы пробовали, не работает.

Однако одним из способов достижения эффекта создания страницы из строки является размещение пустой «страницы-скелета» где-нибудь с URL-адресом (может быть localhost), а затем включение Javascript (используя includeJs) в пустая страница. Javascript, который вы включаете в пустую страницу, может использовать document.write("<p>blah blah blah</p>") для динамического добавления содержимого на веб-страницу.

Я когда-либо делал это, но, насколько мне известно, это должно сработать.

Пример страницы скелета:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head></head>
<body></body>
</html>
person laker    schedule 31.07.2012
comment
Я так и думал... Я видел что-то, где кто-то загружал локальные файлы и помещал их в массив, а затем открывал их с помощью Phantom. Я думал, что они на самом деле загружают html-контент, но, посмотрев еще раз, я понял, что это просто имя файла! Я считаю, что вышеизложенное должно работать для меня просто отлично.... спасибо за помощь! - person mike; 31.07.2012

Это очень просто, взгляните на пример colorwheel.js. .

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

Это все! Затем вы можете манипулировать страницей, например. представить его как изображение.

person Ariya Hidayat    schedule 02.08.2012
comment
Я очень опаздываю с этим, но... это работает только при использовании cli-версии фантома. Невозможно с плагином, который я использую... опять же. - person mike; 13.03.2014
comment
@mike, это не код node.js, это фантомный скрипт, который можно использовать со многими фантомными модулями npm, которые я видел. - person japrescott; 29.05.2014
comment
Будет ли это также отображать javascript, встроенный в строку html? например, '‹html›‹script›js, который изменяет страницу здесь...‹/script›‹script src='someotherpagemodifyingcode.js’›‹/script›..blahblah‹/html›' - person sjdirect; 27.10.2015
comment
@sjdirect Для этого вам, вероятно, лучше сделать page.injectJs("someotherpagemodifyingcode.js"); - person XåpplI'-I0llwlg'I -; 18.11.2015

Для этого вам нужно установить содержимое страницы в соответствии с вашей строкой.

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)

person rahulroy9202    schedule 06.04.2015

Просто хотел упомянуть, что недавно у меня была аналогичная потребность, и я обнаружил, что могу передавать ссылки на стиль file:// в качестве параметра URL, поэтому я выгрузил свою строку HTML в локальный файл, а затем передал полный путь к моему сценарию захвата (django_screamshot), который в основном использует casperjs и phantomjs + скрипт capture.js.

Во всяком случае, он просто работает и достаточно быстро ..

person MGM    schedule 11.06.2013

Я получил следующее для работы в PhantomJS версии 2.0.0. В то время как раньше я использовал page.open() для открытия страницы из файловой системы и установки обратного вызова:

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

Теперь я выполняю то же самое из строковой переменной со страницей HTML. Метод page.setContent() требует URL-адрес в качестве второго аргумента, и он использует fs.absolute() для создания URL-адреса file://.

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