2014-06-12 69 views
0

我正在使用casperjs來刮一個網站。我設置了一個函數,它將一個字符串存儲到一個名爲images的變量中(如下所示),並且效果很好。用casperjs刮 - 不知道如何處理空的div

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

我剛纔注意到的問題是,並非所有的產品都有圖像,所以當刮板碰到沒有圖像的產品時,它顯然會經過它。我需要它至少以某種方式提醒我(如填充文本那樣簡單,即「沒有圖像在這裏」),因爲我所做的是我複製該字符串(以及可能的其他字符串)並將它們組織到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> 
+0

正如我理解你的問題,當產品沒有顯示圖像時,那裏甚至沒有'img'標籤,這樣該產品就不會出現在所選的'img'中,通過'.search-產品image'。如果是的話,那麼你需要提供一個產品的示例HTML和一個沒有圖像的產品。一般建議是:通過XPath選擇所有沒有圖像的產品(因爲它不可能使用CSS)並將它們(您的產品信息)寫入文件。 –

+0

我編輯了我的帖子,如果你現在可以更好地理解它。 – critic

回答

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 S和推動src到一個數組。您可以檢查每個元素的empty屬性。

我懷疑,如果您遍歷所有產品div s並且以這種方式檢查,輸出將會更有意義。因爲那樣你也可以將產品名稱寫入csv。

您可以使用CSS選擇器,但您需要使:nth-child選擇層次更高(產品div列表)。這是因爲:nth-child僅基於其父項而不是在整個樹上工作。

+0

哇,非常感謝你對輸出的一點按摩,我得到了我想要的東西。 – critic

1

首先,我會做images = casper.getElementsInfo('.search-product-image'),這將給你匹配.search-product-image元素的數組。然後你可以遍歷這個數組,並從每個元素中提取出src屬性:var src = image.attributes.src

既然你有src屬性,你可以簡單地檢查它是否有值。如果沒有,則可以將其分配給佔位符文本。