Javascript 单击每个元素,然后使用horseman进行刮除

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的node.js模块从包含JavaScript的站点中获取一些数据。我很难弄清楚,如果每个跨度元素中包含某个元素,如何单击该元素,在本例中为table。这将扩展该元素并生成可用于刮取的数据,而这些数据现在是隐藏的

我现在有什么

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)
其中:

  • XXX
    应该是span.title内内容的选择器(因此waitForSelector实际上会等待)。例如,让我们考虑一下这个标记:

    
    ...
    废话
    

在上面的示例中,您将使用
.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();
    });
}