web-dev-qa-db-fra.com

PhantomJS crée une page à partir d'une chaîne

Est-il possible de créer une page à partir d'une chaîne?

exemple:

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

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

J'ai déjà essayé ce qui précède sans succès ....

En outre, je pense qu'il convient de mentionner que j'utilise nodejs avec phantomjs-node (https://github.com/sgentle/phantomjs-node)

Merci!

34
mike

En regardant les phantomjs API , page.open nécessite une URL comme premier argument, pas une chaîne HTML. C'est pourquoi ce que vous avez essayé ne fonctionne pas.

Cependant, une façon d’obtenir l’effet de la création d’une page à partir d’une chaîne consiste à héberger une "page squelette" vide, quelque part avec une URL (peut être localhost), puis à inclure Javascript (en utilisant includeJs) dans le page vide. Le Javascript que vous incluez dans la page vierge peut utiliser document.write("<p>blah blah blah</p>") pour ajouter dynamiquement du contenu à la page Web.

Je l'ai déjà fait, mais AFAIK cela devrait fonctionner.

Exemple de page squelette:

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

C'est très simple, jetez un œil à l'exemple colorwheel.js .

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

C'est tout! Ensuite, vous pouvez manipuler la page, par exemple le rendre comme une image.

121
Ariya Hidayat

Pour ce faire, vous devez définir le contenu de la page sur votre chaîne.

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();
      });
  });
});

vous devez utiliser page.set() pour définir le contenu html.

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

Les propriétés ne peuvent pas être obtenues/définies directement.
Utilisez plutôt page.get ('version', rappel) ou page.set ('viewportSize', {largeur: 640, hauteur : 480}), etc.

Les objets imbriqués sont accessibles en incluant des points dans les clés, tels que page.set ('settings.loadImages', false)

18
rahulroy9202

J'ai obtenu ce qui suit pour travailler dans PhantomJS version 2.0.0. Alors qu'avant, j'utilisais page.open () pour ouvrir une page à partir du système de fichiers et définir un rappel:

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

Maintenant, j'accomplis la même chose à partir d'une variable de chaîne avec la page HTML. La méthode page.setContent() nécessite une URL comme deuxième argument, et celle-ci utilise fs.absolute() pour construire une URL file: //.

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

Je voulais juste mentionner que j'avais récemment un besoin similaire et j'ai découvert que je pouvais transmettre des références de style file: // en tant que paramètre d'URL, alors j'ai vidé ma chaîne HTML dans un fichier local puis passé le chemin complet de mon script de capture (Django_screamshot) qui utilise essentiellement casperjs et phantomjs + un script capture.js.

Quoi qu'il en soit, cela fonctionne et c'est assez rapide ..

2
MGM