CasperJS скребок не может получить содержимое с помощью селектора

Я использую CasperJS через PhantomJS, чтобы отбирать данные с сайта, который не имеет 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();
   });    

1 ответ

Решение

Проблема в e.getAttribute('span.opening-bid theme-color'), так как span.opening-bid theme-color не является атрибутом td.details. Это даже не действительный (суб) селектор CSS, потому что есть место, где должна быть точка.

Я подозреваю, что вы хотите, чтобы содержимое каждого элемента 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;
});
Другие вопросы по тегам