Ich versuche Casperjs zu verwenden, um eine Liste von Links von einer Seite zu erhalten, öffne dann jeden dieser Links und füge zu einem Array-Objekt einen bestimmten Datentyp von diesen Seiten hinzu.
Das Problem, das ich habe, ist mit der Schleife, die über jedes Listenelement ausgeführt wird.
Zuerst erhalte ich listOfLinks
von der Originalseite. Dieser Teil funktioniert und mit Länge kann ich überprüfen, ob diese Liste ausgefüllt ist.
Mit der loop-Anweisung this.each
(siehe unten) wird jedoch keine der Konsolenanweisungen angezeigt, und casperjs scheint diesen Block zu überspringen.
Ersetzen von this.each
durch eine Standard-for-Schleife, die Ausführung findet nur teilweise durch die erste Verbindung statt, da die Anweisung "Creating new array in object for x.html" einmal erscheint und der Code dann nicht mehr ausgeführt wird. Die Verwendung eines IIFE ändert dies nicht.
Bearbeiten: Im ausführlichen Debugging-Modus passiert Folgendes:
%Vor%Aus irgendeinem Grund wird die URL, die an die Funktion thenOpen übergeben wird, auf leer geändert ...
Ich habe das Gefühl, dass es etwas an Casperjs asynchronem Wesen gibt, das ich hier nicht verstehe, und ich wäre dankbar, wenn ich auf ein funktionierendes Beispiel hingewiesen würde.
%Vor%Ich habe beschlossen, unsere eigene Stackoverflow.com-Seite als Demo-Site zu verwenden, auf der Ihr Skript läuft. Es gab ein paar kleinere Dinge, die ich in Ihrem Code korrigiert habe, und das Ergebnis ist diese Übung, um Kommentare von PhantomJS Bounty-Fragen zu erhalten.
%Vor% Was geändert wird: page.evaluate
gibt nun einfache Arrays zurück, die für die korrekte iteration von casper.each () benötigt werden. href
Attribute werden sofort in page.evaluate extrahiert. Auch diese Korrektur:
Das Ergebnis der Skriptausführung ist
%Vor% Sie geben DOM-Knoten in der Funktion evaluate()
zurück, was nicht zulässig ist. Sie können stattdessen die tatsächlichen URLs zurückgeben.
Hinweis: Die Argumente und der Rückgabewert für die Funktion evaluate müssen ein einfaches primitives Objekt sein. Die Faustregel: Wenn es über JSON serialisiert werden kann, ist es in Ordnung.
Verschlüsse, Funktionen, DOM-Knoten usw. funktionieren nicht!
Referenz: PhantomJS#evaluate
Tags und Links javascript phantomjs casperjs