私はCasperjsを使用してページからリンクのリストを取得し、それらのリンクのそれぞれを開いて、それらから特定のタイプのデータを配列オブジェクトに追加しようとしていますページ。casperjsは、casper.eachを使用してリンクのリストを反復処理します。
私が抱えている問題は、各リスト項目に対して実行されるループの問題です。
最初に私はlistOfLinks
を元のページから入手します。この部分は機能し、長さを使用して、このリストに値が設定されていることを確認できます。
ただし、ループステートメントthis.each
を以下のように使用すると、コンソールステートメントは表示されず、casperjsはこのブロックをスキップするように見えます。
this.each
を標準のforループに置き換えると、「x.htmlのオブジェクトに新しい配列を作成する」というステートメントが1回表示され、その後コードの実行が停止するため、実行は最初のリンクを途中で終了します。 IIFEを使用してもこれは変わりません。
編集:冗長デバッグモードでは、次のことが起こる:
Creating new array object for https://example.com
[debug] [phantom] Navigation requested: url=about:blank, type=Other, willNavigate=true, isMainFrame=true
のでthenOpen関数に渡されたURLが空白に変更されます何らかの理由で...
私のような感じ私がここで把握していないCasperjsの非同期性については何かがあり、実際の例に向けて指摘することに感謝します。
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));
});
は実際にあなたのスクリプトですべての問題を解決する必要がある別の答えを追加しました。 – Vaviloff