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;
});
我正在通过 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;
});