Ich versuche Casperjs zu verwenden, um eine Liste der Links von einer Seite zu erhalten, öffnen Sie dann jeden dieser Links, und fügen Sie zu einem Array-Objekt einen bestimmten Datentyp von diesen Seiten.Casperjs Iterieren über eine Liste von Links mit casper.each
Das Problem, das ich habe, ist mit der Schleife, die über jedes der Listenelemente ausgeführt wird.
Zuerst bekomme ich eine listOfLinks
von der ursprünglichen Seite. Dieser Teil funktioniert und mit Länge kann ich überprüfen, dass diese Liste aufgefüllt ist.
Mit der loop-Anweisung this.each
(siehe unten) wird jedoch keine der Konsolenanweisungen angezeigt und casperjs scheint diesen Block zu überspringen.
Ersetzen this.each
durch einen Standard für die Schleife, die Ausführung wird nur teilweise durch den ersten Link, wie die Anweisung "Creating new Array in Objekt für X.html" erscheint einmal und dann der Code beendet die Ausführung. Die Verwendung eines IIFE ändert dies nicht.
Edit: im ausführlichen Debug-Modus geschieht Folgendes:
Creating new array object for https://example.com
[debug] [phantom] Navigation requested: url=about:blank, type=Other, willNavigate=true, isMainFrame=true
Also aus irgendeinem Grund die URL, die in die thenOpen Funktion geändert wird, um leer übergeben wird ...
Ich fühle mich wie Es gibt etwas an Casperjs asynchronem Wesen, das ich hier nicht verstehe, und wäre dankbar, auf ein funktionierendes Beispiel hingewiesen zu werden.
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));
});
Added eine andere Antwort, die alle Probleme mit Ihrem Skript eigentlich lösen sollte. – Vaviloff