我使用casperjs从网站上抓取文本,到目前为止它工作正常。但是,我从这个页面上搜集了数百个产品,其中一些产品旁边有一个橙色按钮。
橙色按钮的类别为button small orange
。如果单击此橙色按钮,将打开一个带有产品描述的灯箱。
如果有橙色按钮,如果在那里点击描述,然后退出灯箱然后继续迭代100个产品,我将如何点击橙色按钮?
答案 0 :(得分:2)
您需要确定每个步骤中涉及的元素。您可以使用Firefox或Chrome中的开发人员工具执行此操作。
你可以找到这样的元素数量:
var buttonNumber = casper.getElementsInfo(".button.small.orange").length;
然后以最大值为基础迭代按钮:
var x = require('casper').selectXPath
for(var i = 0; i < buttonNumber; i++) {
casper.thenClick(x("(//*[contains(@class,'button') and contains(@class,'small') and contains(@class,'orange')])["+(i+1)+"]"));
scheduleScrapeAndClose();
}
XPath表达式的//*[contains(@class,'button') and ...]
部分基本上等同于.button.small.orange
CSS选择器。它返回一个节点列表,之后的索引就是你迭代的按钮。喜欢:(//*[...])[1]
您唯一需要做的就是定义scheduleScrapeAndClose
函数。它可能看起来像这样:
function scheduleScrapeAndClose(){
casper.waitUntilVisible("your light box selector");
casper.then(function(){
// scrape the description
var descr = this.fetchText("your description selector");
this.click("your light box close selector");
});
casper.waitWhileVisible("again, your light box selector");
}
我假设每次点击按钮只有一个灯箱。
将它们放在一起它看起来像这样:
var x = require('casper').selectXPath,
casper = require('casper').create();
function scheduleScrapeAndClose(){
// stuff from above
}
casper.start(url);
casper.then(function(){
var buttonNumber = casper.getElementsInfo(".button.small.orange").length;
for(var i = 0; i < buttonNumber; i++) {
casper.thenClick(x("(//*[contains(@class,'button') and contains(@class,'small') and contains(@class,'orange')])["+(i+1)+"]"));
scheduleScrapeAndClose();
}
});
casper.run(function(){this.exit();});