CasperJS scraper 无法通过选择器检索内容

CasperJS scraper can't retrieve content by selector

我正在通过 PhantomJS 使用 CasperJS 从没有 API 的站点获取数据。我正在关注文档,每当我添加最后一个函数时

getTractorData()

突然收不到数据

脚本的第一部分创建一个链接数组。脚本的最后一部分读取这个链接数组,遍历所有链接并在页面上查找这些元素

<td class="details">
    <span class="opening-bid theme-color">

当脚本找到这些元素时,然后将这些项目放入一个数组中。

这是我的脚本:

 var casper = require('casper').create({
 debug:true,
 logLevel: 'verbose',
 pageSettings: {
 loadImages: true,
 loadPlugins: true,
 userAgent: 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.2 Safari/537.36'
 }
 });

 var links = [];
 var tractorData = [];

 function getLinks() {
   var links = document.querySelectorAll('tr.onelinelistrow a');
   return Array.prototype.map.call(links, function(e) {
      return "http://www.ggg.com"+e.getAttribute('href');
 });
 }

 function getTractorData() {
  var links = document.querySelectorAll('tr.details');
  return Array.prototype.map.call(links, function(e) {
    return e.getAttribute('span.opening-bid theme-color');
 });
 }

 casper.start('http://www.ggg.com/list/list.aspx?bcatid=464&DidSearch=1&EID=1&LP=TH&FullText=aa23&ETID=1&Manu=APACHE&mdlx=Contains&DisplayExtraTHOSpecs=1&Cond=All&SO=2&btnSearch=Search', function() {
 });

 casper.thenOpen('http://www.ggg.com/list/list.aspx?pg=1&ETID=1&SO=2&Manu=APACHE&mdlx=contains&bcatid=464&Pref=1&Thumbs=1&scf=false', function() {
 links = links.concat(this.evaluate(getLinks));
 });

 casper.thenOpen('http://www.ggg.com/list/list.aspx?pg=2&ETID=1&SO=2&Manu=APACHE&mdlx=contains&bcatid=464&Pref=1&Thumbs=1&scf=false', function() {
 links = links.concat(this.evaluate(getLinks));
 });

 casper.thenOpen('http://www.ggg.com/list/list.aspx?pg=3&ETID=1&SO=2&Manu=APACHE&mdlx=contains&bcatid=464&Pref=1&Thumbs=1&scf=false', function() {
 links = links.concat(this.evaluate(getLinks));
 });

 casper.then(function(){
   this.each(links,function(self,link){
    self.thenOpen(link,function(a){
        tractorData = tractorData.concat(this.evaluate(getTractorData));
     });
  });
  });  

  casper.run(function() {
   this.echo(tractorData.length + ' data found:');
   this.echo(' - ' + tractorData.join('\n - ')).exit();
   });    

问题是 e.getAttribute('span.opening-bid theme-color'),因为 span.opening-bid theme-color 不是 td.details 的属性。它甚至不是一个有效的 CSS(子)选择器,因为有一个 space 应该是一个点。

怀疑 您想要每个 span 元素的内容,这些元素是 td.details 元素的子元素。您可以像这样获取每个子跨度的内容:

var links = document.querySelectorAll('tr.details');
return Array.prototype.map.call(links, function(e) {
    return e.querySelector('span.opening-bid.theme-color').textContent;
});

甚至

var links = document.querySelectorAll('tr.details > span.opening-bid.theme-color');
return Array.prototype.map.call(links, function(e) {
    return e.textContent;
});