2016-05-16 7 views
0

この質問はsimilartoothersですが、私が持っていた問題はより基本的でした。CasperJSは各URLをループします

は、これは私のコードです:

var links = []; 
var casper = require('casper').create(); 

function getLinks() { 
    var links = document.querySelectorAll('div#mw-content-text table.wikitable tbody tr td i b a'); 
    return Array.prototype.map.call(links, function(e) { 
     return 'https://en.wikipedia.org' + e.getAttribute('href'); 
    }); 
} 

casper.start('https://en.wikipedia.org/wiki/David_Bowie_discography'); 

casper.then(function() { 
    // aggregate results for the 'casperjs' search 
    links = this.evaluate(getLinks); 
}); 

casper.each(links, function (self, link) { 
    self.thenOpen(fullURL, function() { 
     this.echo(this.getTitle() + " - " + link); 
    }); 
}); 

casper.run(); 

私はそれがQuickstartからコピーされるようlinksが作成されますことを知っているが、私は、それが発見されたすべてのリンクを開くように変更しました。

私が得意とするのは、私が期待している各タイトルを出力するのではなく、何もエコーされないということです。これは私がファイルを呼んでいる方法です:

~ $ casperjs casper-google-disco.js 

答えて

4

修正は、最終的には非常に簡単でしたが、そこにはエラーがなかったし、他の誰がこれを直撃しているように見えないようにそれを見つけるために、私の年齢を取りました。

が呼び出される前にlinks変数が設定されないという問題があります。関数thenの中にeachを入れると、私の問題は解決します。

CasperJSサンプルのeach.js exampleは、IIFEを必要とせずに配列をループできることを確認するのに役立ちました。

var links = []; 
var casper = require('casper').create(); 

function getLinks() { 
    var links = document.querySelectorAll('div#mw-content-text table.wikitable tbody tr td i b a'); 
    return Array.prototype.map.call(links, function(e) { 
     return 'https://en.wikipedia.org' + e.getAttribute('href'); 
    }); 
} 

casper.start('https://en.wikipedia.org/wiki/David_Bowie_discography'); 

casper.then(function() { 
    // aggregate results for the 'casperjs' search 
    links = this.evaluate(getLinks); 

    casper.each(links, function (self, link) { 
     self.thenOpen(link, function() { 
      this.echo(this.getTitle() + " - " + link); 
     }); 
    }); 
}); 


casper.run(); 
関連する問題