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 Toutefois, à l'aide de l'instruction LOOP remplaçant 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> 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>
Ceci.Chaque code> Comme ci-dessous, aucune des déclarations de console ne montre jamais et Casperjs semble sauter sur ce bloc. p>
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>
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));
});
3 Réponses :
Vous retournez Référence: () code> fonction, qui n'est pas autorisé. Vous pouvez plutôt retourner les URL actuelles. P>
Phantomjs # Évaluez CODE>
< / p>
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 code> et ensuite casperjs échoue silencieusement. Il semble que le lien correct qui soit passé dans Thenopen est changé à propos de: blanc ...
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: espère que cela aide. P> p>
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"]}}
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.
Ajout d'une autre réponse qui devrait réellement résoudre tous les problèmes avec votre script.