我正在使用名为horseman的node.js模块从包含JavaScript的网站中删除一些数据。我无法弄清楚如何点击每个span元素,如果它包含一个元素,在这种情况下是表格。这将扩展该元素并生成可用于刮擦的数据,这些数据现在被隐藏。
我现在拥有什么
horseman
.open(url)
.click("span.title")
.waitforSelector("span.title")
.then(scrape)
刮擦功能:
function scrape() {
return new Promise(function (resolve, reject) {
return getLinks()
.then(function (newLinks) {
links = links.concat(newLinks);
if (links.length < 1)
return horseman
.then(scrape);
}
})
.then(resolve);
});
}
getlinks function()
var links = [];
function getLinks() {
return horseman.evaluate(function () {
var links = [];
$("span.title").each(function (item) {
var link = {
title: $(this).text()
};
links.push(link);
});
return links;
});
}
我最初的想法是,在getLinks()函数中,我可以检查项是否包含表然后单击然后刮,但不知道如何实现它。 我们的想法是扩展所有尚未扩展的span元素,这意味着数据是可见的并且能够被抓取。我已经打了一堵砖墙,所以任何帮助都会很棒!
答案 0 :(得分:2)
以下代码:
horseman
.open(url)
.click("span.title")
.waitforSelector("span.title")
.then(scrape)
...不起作用,因为.click()
骑士行动只解决单个元素。相反,您可以尝试以下适用于许多元素的代码:
horseman
.open(url)
.evaluate(clickItems)
.waitforSelector("span.title XXX")
.then(scrape)
其中:
XXX
应该是span.title内容的选择器(所以waitForSelector实际上会等待)。例如,让我们考虑一下这个标记:
<span class="title"><!-- this is the clickable item -->
<table>...</table>
<div class="show-on-click">Blah blah</div>
</span>
在上面的示例中,您将使用.waitForSelector('span.item .show-on-click')
。在数据出现之前,您必须找到哪个选择器不存在。 (或使用.wait(1000)
代替)
clickItem函数定义如下(我看到你使用jQuery所以我也会这样做)
function clickItems() {
var $items = $('span.title:has(table)');
$items.each(function(index, $item) {
$item.click();
});
}
注意:这将点击所有元素span.title
。您可以修改click元素以在每个$item
中添加表存在测试,但我想如果其他点击不执行任何操作,您可以省略它。