2015-11-08 2 views
1

Я пытаюсь заставить PhantomJS взять строку html, а затем отобразить всю страницу в качестве браузера (включая выполнение любого javascript в источнике страницы). Мне нужен результат html в виде строки. Я видел примеры page.open, которые бесполезны, поскольку у меня уже есть источник страницы в моей базе данных.PhantomJS как визуализировать javascript в html-строке

Нужно ли использовать page.open для запуска механизма рендеринга javascript в PhantomJS? Есть ли все-таки сделать это все в памяти (т. Е. Без страницы.open делать запрос или читать/писать html-источник с/на диск?

Я видел аналогичный вопрос и ответ here, но это не совсем решить мою проблему. После запуска ниже код, я ничего сделать не кажется, чтобы сделать JavaScript в исходной строке HTML.

var page = require('webpage').create(); 
page.setContent('raw html and javascript in this string', 'http://whatever.com'); 
//everything i've tried from here on doesn't execute the javascript in the string 

-------------- Update ---- -----------

Пробовал следующее на основе приведенного ниже предложения, но это все еще не работает. Просто возвращает исходный источник, который я предоставил без рендеринга javascript.

var page = require('webpage').create(); 
page.settings.localToRemoteUrlAccessEnabled = true; 
page.settings.webSecurityEnabled = false; 
page.onLoadFinished = function(){ 
    var resultingHtml = page.evaluate(function() { 
     return document.documentElement.innerHTML; 
    }); 
    console.log(resultingHtml); 
    //console.log(page.content); // this didn't work either 
    phantom.exit(); 
}; 
page.url = input.Url; 
page.content = input.RawHtml; 
//page.setContent(input.RawHtml, input.Url); //this didn't work either 
+0

Какую версию PhantomJS вы используете? Пожалуйста, зарегистрируйтесь в событиях onConsoleMessage, 'onError',' onResourceError', 'onResourceTimeout' ([Пример] (https://gist.github.com/artjomb/4cf43d16ce50d8674fdf#file-1_phantomerrors-js)). Возможно, есть ошибки. –

ответ

0

SetTimeout заработал, хотя я не очень доволен ожидаемым количеством времени для каждой страницы. Ожидаемый подход waitFor, который обсуждается here, не работает, поскольку я понятия не имею, какие элементы могут иметь каждая страница.

var system = require('system'); 
var page = require('webpage').create(); 
page.setContent(input.RawHtml, input.Url); 
window.setTimeout(function() { 
    console.log(page.content); 
    phantom.exit(); 
}, input.WaitToRenderTimeInMilliseconds); 
+0

Я, скорее всего, попробую что-то вроде checkin $. Active в будущем, чтобы увидеть, есть ли у страницы какие-либо ожидающие запросы ajax. Тогда я мог бы избежать выполнения setTimeout. – sjdirect

+0

Вы также можете использовать некоторые предложения из [здесь] (http://stackoverflow.com/q/11340038/1816580), чтобы дождаться полной загрузки страницы. –

2

следующие работы

page.onLoadFinished = function(){ 
    console.log(page.content); // rendered content 
}; 
page.content = "your source html string"; 

Но вы должны иметь в виду, что если вы установите страницу из строки, домен будет около: пусто. Так что, если HTML загружает ресурсы из других областей, то вы должны запустить PhantomJS с опциями --web-security=false --local-to-remote-url-access=true командной строки:

 
phantomjs --web-security=false --local-to-remote-url-access=true script.js 

Кроме того, вам, возможно, придется ждать завершения выполнения JavaScript, который может не быть закончен, когда PhantomJS думал, что закончил. Используйте либо setTimeout(), чтобы подождать статическое количество времени, либо waitFor(), чтобы подождать определенного состояния на странице. В этом вопросе приведены более надежные способы дождаться полной страницы: phantomjs not waiting for “full” page load

+0

Спасибо за ответ. Я обновил свой вопрос выше, используя код, который пытается предложить то, что вы предлагаете. По-видимому, это не решает мою проблему. Просто возвращает исходный источник, который я предоставил ему, ничего не отображал. – sjdirect

+1

Вы ничего не сказали о том, что делает ваша страница, поэтому я дал общий ответ. Я также немного расширил его. –

0

Может быть, не ответ, который вы хотите, но с помощью PhantomJsCloud.com вы можете сделать это легко, Вот пример: «Новые публикации» http://api.phantomjscloud.com/api/browser/v2/a-demo-key-with-low-quota-per-ip-address/?request={url:%22http://example.com%22,content:%22%3Ch1%3ENew%20Content!%3C/h1%3E%22,renderType:%22png%22,scripts:{domReady:[%22var%20hiDiv=document.createElement%28%27div%27%29;hiDiv.innerHTML=%27Hello%20World!%27;document.body.appendChild%28hiDiv%29;window._pjscMeta.scriptOutput={Goodbye:%27World%27};%22]},outputAsJson:false} это контент, который заменяет исходное содержимое, и «Hello World!». помещается на страницу по сценарию.

Если вы хотите сделать это с помощью обычных PhantomJs, вам нужно будет использовать функции injectJs или includeJs после загрузки содержимого страницы.

+0

Документы для PhantomJsCloud можно найти по адресу http://api.phantomjscloud.com – JasonS

+0

о и раскрытии, я написал PhantomJsCloud – JasonS

Смежные вопросы