用casperjs刮痧 - 不知道如何处理空div

时间:2014-06-12 15:32:32

标签: casperjs scraper

我使用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">&nbsp;</div>

2 个答案:

答案 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仅基于其父级而不是整个树工作。