Casperjs iteriert über eine Liste von Links mit casper.each

9

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%     
Laurence 03.11.2016, 23:08
quelle

3 Antworten

4

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:

%Vor%

Das Ergebnis der Skriptausführung ist

%Vor%     
Vaviloff 08.11.2016, 09:20
quelle
3

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

    
Terry Li 06.11.2016 02:43
quelle
1

Wenn ich Ihr Problem richtig verstehe, geben Sie [] einen globalen Bereich ein. In Ihrem Code hätte ich Folgendes getan:

%Vor%

Hoffe, das hilft.

    
Jadeclan 06.11.2016 20:14
quelle

Tags und Links