我使用casperjs刮取网站。我设置了一个函数,它将一个字符串存储到一个名为images的变量中(如下所示)并且效果很好。
images = casper.getElementsAttribute('.search-product-image','src');
然后我在fs中调用该变量,这样我就可以将其导出为CSV,这也可以正常工作。
casper.then(function() {
var f = fs.open('e36v10.csv', 'w');
f.write(imagessplit + String.fromCharCode(13));
f.close();
});
我刚才注意到的问题是并非所有产品都有图像,因此当刮刀撞到没有图像的产品时,显然会经过它。我需要它至少以某种方式提醒我(像填充文本那样简单,并且#34;这里没有图像")当它通过没有图像的产品时,因为我做的是复制该字符串(沿着可能还有其他字符串)并将它们组织成CSV中的列,它会混淆所有内容的顺序而不需要某种填充文本("此处没有图像")。感谢
修改
以下是我试图提取的网站的确切来源。
我可以从中获取图像的产品,我的代码工作正常:
<div class="search-v4-product-image">
<img alt="238692" class="search-product-image" src="http://d5otzd52uv6zz.cloudfront.net/group.jpg">
<p class="image-overlay">Generic</p>
</div>
没有图像的产品和我的刮刀直接通过它而没有提醒我。
<div class="search-v4-product-image"> </div>
答案 0 :(得分:1)
首先,我会做images = casper.getElementsInfo('.search-product-image')
,它将为您提供与.search-product-image
匹配的元素数组。然后,您可以迭代此数组并从以下元素中提取src
属性:var src = image.attributes.src
现在您拥有src
属性,您只需检查它是否有值。如果没有,那么您可以将其分配给占位符文本。
答案 1 :(得分:0)
您可以通过以下方式为页面上下文编写此功能:
casper.then(function(){
var imgList = this.evaluate(function(){
var productImages = document.querySelectorAll("div.search-v4-product-image"),
imageList = [];
Array.prototype.forEach.call(productImages, function(div){
if (div.children.length == 0) {
imageList.push({empty: true});
} else {
var img = div.children[0]; // assumes that the image is the first child
imageList.push({empty: false, src: img.src});
}
});
return imageList;
});
var csv = "";
imgList.forEach(function(img){
if (img.empty) {
csv += ";empty";
} else {
csv += img.src+";";
}
});
fs.write('e36v10.csv', csv, 'w');
});
迭代所有div
并将src
推送到数组。您可以检查每个元素的empty
属性。
我怀疑如果你遍历所有产品div
并以这种方式检查输出会更有意义。因为那时你也可以把产品名写到csv。
您可以使用CSS选择器,但是您需要在层次结构(产品:nth-child
列表)中选择更高的div
。这是因为:nth-child
仅基于其父级而不是整个树工作。