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;
});