9
votes

Casperjs itération sur une liste de liens utilisant Casper.Chaque

J'essaie d'utiliser Casperjs pour obtenir une liste de liens d'une page, puis ouvrez chacun de ces liens et ajouter à un objet de tableau un type particulier de données de ces pages.

Le problème que j'ai Avec la boucle qui exécute sur chacun des éléments de la liste. P>

Je reçois d'abord un listOflinks code> dans la page d'origine. Cette partie fonctionne et utilise la longueur, je peux vérifier que cette liste est peuplée. P>

Toutefois, à l'aide de l'instruction LOOP Ceci.Chaque code> Comme ci-dessous, aucune des déclarations de console ne montre jamais et Casperjs semble sauter sur ce bloc. p>

remplaçant this.ach code> avec une norme de boucle, l'exécution ne fait que partie du premier lien, comme la déclaration "Création de nouveau tableau dans l'objet pour x.html "apparaît une fois, puis le code cesse d'exécuter. En utilisant un iife ne change pas cela. P>

EDIT: strong> en mode de débogage verbos, ce qui suit se produit: p> xxx pré>

donc pour une raison quelconque de l'URL transmise à la fonction Thenopen est modifiée en blanc ... P>

Je me sens comme il y a quelque chose à propos de la nature asynchrone de Casperjs que je ne sais pas ici et que je serais reconnaissant d'être dirigé vers un exemple de travail. P>

casper.then(function () {

  var date = Date.now();
  console.log(date);

  var object = {};
  object[date] = {}; // new object for date

  var listOfLinks = this.evaluate(function(){
    console.log("getting links");
    return document.getElementsByClassName('importantLink');
  });

  console.log(listOfLinks.length);

  this.each(listOfLinks, function(self, link) {

    var eachPageHref = link.href;

    console.log("Creating new array in object for " + eachPageHref);

    object[date][eachPageHref] = []; // array for page to store names

    self.thenOpen(eachPageHref, function () {

      var listOfItems = this.evaluate(function() {
        var items = [];
        // Perform DOM manipulation to get items
        return items;
      });
    });

    object[date][eachPageHref] = items;

  });
  console.log(JSON.stringify(object));

});


1 commentaires

Ajout d'une autre réponse qui devrait réellement résoudre tous les problèmes avec votre script.


3 Réponses :


3
votes

Vous retournez nœuds DOM dans l'évaluation () fonction, qui n'est pas autorisé. Vous pouvez plutôt retourner les URL actuelles.

Remarque: Les arguments et la valeur de retour à la fonction Evaluate doivent être un objet primitif simple. La règle de base: si elle peut être sérialisée via JSON, c'est bien.

fermetures, fonctions, nœuds DOM, etc. ne fonctionneront pas!

Référence: Phantomjs # Évaluez < / p>


1 commentaires

Merci, cela avait l'air vraiment prometteur. J'ai fait les changements mais cela n'a pas résolu le problème. Et je viens de réaliser que dans le mode de débogage, ce qui suit se produit: Création d'un nouvel objet Array pour https://example.com [débogage] [Phantom] Navigation demandée: URL = à propos de: vide, type = Autre, Willnavigate = True, ismainframe = true et ensuite casperjs échoue silencieusement. Il semble que le lien correct qui soit passé dans Thenopen est changé à propos de: blanc ...



1
votes

Si je comprends votre problème correctement, pour résoudre, donner des articles [] une portée globale. Dans votre code, j'aurais fait ce qui suit: xxx

espère que cela aide.


0 commentaires

4
votes

J'ai décidé d'utiliser notre propre Stackoverflow.com comme site de démonstration pour exécuter votre script contre. Il y avait quelques choses mineures que j'ai corrigées dans votre code et le résultat est cet exercice pour obtenir des commentaires des questions de Bounty Phantomjs.

{"1478596579898":{"http://stackoverflow.com/questions/40410927/phantomjs-from-node-on-windows":["en.wikipedia.org/wiki/File_URI_scheme – Igor 2 days ago\n","@Igor is there something in particular you see wrong, or are you suggesting the phantom module has an incorrect URI? – Danny Buonocore 2 days ago\n","Probably windows security issue not allowing to run an unsigned program. – Vaviloff yesterday\n"],"http://stackoverflow.com/questions/40412726/casperjs-iterating-over-a-list-of-links-using-casper-each":["Thanks, this looked really promising. I made the changes but it didn't solve the problem. And I just realised that in debug mode the following happens: Creating new array object for https://example.com [debug] [phantom] Navigation requested: url=about:blank, type=Other, willNavigate=true, isMainFrame=true and then Casperjs silently fails. It seems that the correct link that gets passed into thenOpen gets changed to about:blank... – cyc665 yesterday\n"]}}


1 commentaires

Merci, j'ai eu votre script fonctionnant bien sur Stackoverflow et certains autres sites Web. Cependant, cela ne fonctionne toujours pas sur le site Web que je voulais, ce qui est peut-être dû au fait qu'il est particulièrement complexe avec beaucoup d'ajax et d'autres scripts. Après tout, je pense que le problème était spécifique au site Web. Merci beaucoup pour votre aide néanmoins, c'est un script très utile.