Javascript 单击每个元素,然后使用horseman进行刮除
我正在使用一个名为horseman的node.js模块从包含JavaScript的站点中获取一些数据。我很难弄清楚,如果每个跨度元素中包含某个元素,如何单击该元素,在本例中为table。这将扩展该元素并生成可用于刮取的数据,而这些数据现在是隐藏的 我现在有什么Javascript 单击每个元素,然后使用horseman进行刮除,javascript,node.js,Javascript,Node.js,我正在使用一个名为horseman的node.js模块从包含JavaScript的站点中获取一些数据。我很难弄清楚,如果每个跨度元素中包含某个元素,如何单击该元素,在本例中为table。这将扩展该元素并生成可用于刮取的数据,而这些数据现在是隐藏的 我现在有什么 horseman .open(url) .click("span.title") .waitforSelector("span.title") .then(scrape) 刮取功能: function s
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()函数中,我可以检查项是否包含表,然后单击,然后刮取,但不确定如何实现它。
其思想是扩展所有尚未扩展的span元素,这意味着数据是可见的,并且可以被刮取。我在该做什么上遇到了困难,所以任何帮助都会很好 以下代码:
horseman
.open(url)
.click("span.title")
.waitforSelector("span.title")
.then(scrape)
…将不起作用,因为.click()
horseman操作仅处理单个元素。相反,您可以尝试在许多元素上使用以下代码:
horseman
.open(url)
.evaluate(clickItems)
.waitforSelector("span.title XXX")
.then(scrape)
其中:
应该是span.title内内容的选择器(因此waitForSelector实际上会等待)。例如,让我们考虑一下这个标记:XXX
... 废话
.waitForSelector('span.item.show on click')
。您必须找到在数据出现之前不存在的选择器。(或改用。等待(1000)
)
- clickItem函数的定义如下(我知道您使用jQuery,所以我也会这么做)
注意:这将单击所有元素
span.title
。您可以修改click元素,在每个$item
中添加一个表状态测试,但是如果其他单击没有任何作用,我想您可以忽略它。您说单击会显示某些内容,但是即使该内容是隐藏的,也可以立即将其删除?你看过页面标记了吗?或者内容会在页面中稍后到达(例如通过ajax)吗?同样,它不是。单击('span.title')。waitforSelector('span.title')
?(引号)注意:如果你点击一个选择器,你不需要等待同一个选择器,如果某个选择器是可点击的,它也已经存在,因此它将立即返回:waitForSelector
方法不等待更改,而是等待是否存在:我查看了页面源代码,内容仅在展开元素后显示。对不起,我错过了报价!好的,我想问题是您的waitForElement
没有等待任何东西,因为选择器已经存在,所以它在单击之后返回元素,但很可能在内容出现之前返回。你能试着用.wait(1000)
来代替吗?我想你误解了这个问题。我知道应该等等。但我不知道应该如何单击每个跨度元素来展开它们,然后刮取数据。编辑我的答案以更精确。此外,我在clickItems函数($items.each,而不是$item.each)中犯了一个错误,因此如何/在何处检查span元素现在是否包含表元素,然后单击?编辑。这部分是简单的jQuery,您将使用span.title:has(table)
而不是span.title
cf。似乎无法实现这一点。我检查了代码,似乎什么也没发生。你没有使用jquery而只是使用javascript有什么用?@Pandaiolo你能帮我解答我的问题吗
horseman
.open(url)
.evaluate(clickItems)
.waitforSelector("span.title XXX")
.then(scrape)
function clickItems() {
var $items = $('span.title:has(table)');
$items.each(function(index, $item) {
$item.click();
});
}