我想在ul>中遍历每个li>,然后将它们添加到数组中。我应该如何创建一个for循环来返回每个li并将它们放入数组中。让我陷入困境是我陷入困境的地方。


 var Nightmare = require('nightmare');
 var nightmare = Nightmare({ show:false})

 nightmare
 .goto( 'https://en.wikipedia.org/wiki/Red_Hat_Enterprise_Linux')

 .wait(500)
 .evaluate(function(){
 var ht = document.querySelector('#toc> ul> li.toclevel-1.tocsection-5> ul
').innerText;&#xA ;返回ht;
})
 .END()
 .then(function(result){
 console.log(result)
})
 .catch(function(error){
 console.error('Search failed:',error);
});


&# xA; 输出:


 PS C:\ scrapping>节点。\ 2.js
 5.1 RHEL 2.1
 5.2 RHEL 3
 5.3 RHEL 4
 5.4 RHEL 5
 5.5 RHEL 6
 5.6 RHEL 7

 PS C:\ scrapping>



答案 0 :(得分:0)
您可以通过调整原始函数来获取所有<li>
的数组,以使用children
属性而不是innerText
属性。
例如:
function () {
var ht = document.querySelector('#toc > ul > li.toclevel-1.tocsection-5 > ul
').children;
return ht;
}
这将返回所有<ul>
个子元素的数组。
答案 1 :(得分:0)
问题在于,当你期望then()中的结果时,会调用nightmare.ipc,并尝试stringify / destringify将其发送到你的应用程序。 HTMLElements(由document.querySelectorAll()返回)可能无法进行字符串化,并且可以在browserWindow的开发者控制台中看到此类错误
您可以轻松地执行此操作:
const Nightmare = require('nightmare');
const nightmare = Nightmare({
show: true,
openDevTools: true,
});
nightmare
.goto('https://en.wikipedia.org/wiki/Red_Hat_Enterprise_Linux')
.evaluate(function(selector) {
var links = document.querySelectorAll(selector);
var passed = [];
for(var ii=0; ii<links.length; ii++) {
passed.push(links[ii].textContent);
}
return passed;
}, '#toc > ul > li.toclevel-1.tocsection-5 > ul > li')
.then(function(result) {
console.log(result); // Outputs length.
})
.catch(function(error) {
console.error('Failed', error);
});
//Output
[ '5.1 RHEL 2.1',
'5.2 RHEL 3',
'5.3 RHEL 4',
'5.4 RHEL 5',
'5.5 RHEL 6',
'5.6 RHEL 7' ]