如何使用 javascript 遍历 ul 中的 li
How to loop over li in ul using javascript
我想遍历 ul> 中的每个 li>,然后将它们添加到一个数组中。我应该如何为每个 li 创建一个 for 循环 return 并将它们放入数组中。让 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;
return ht;
})
.end()
.then(function (result) {
console.log(result)
})
.catch(function (error) {
console.error('Search failed:', error);
});
输出:
PS C:\scrapping> node ..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>
您可以通过调整原始函数以使用 children
属性 而不是 innerText
属性 来获得所有 <li>
的数组.
例如:
function () {
var ht = document.querySelector('#toc > ul > li.toclevel-1.tocsection-5 > ul
').children;
return ht;
}
这将 return 一个包含 <ul>
的所有子元素的数组。
问题是,当您期望 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' ]
我想遍历 ul> 中的每个 li>,然后将它们添加到一个数组中。我应该如何为每个 li 创建一个 for 循环 return 并将它们放入数组中。让 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;
return ht;
})
.end()
.then(function (result) {
console.log(result)
})
.catch(function (error) {
console.error('Search failed:', error);
});
输出:
PS C:\scrapping> node ..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>
您可以通过调整原始函数以使用 children
属性 而不是 innerText
属性 来获得所有 <li>
的数组.
例如:
function () {
var ht = document.querySelector('#toc > ul > li.toclevel-1.tocsection-5 > ul
').children;
return ht;
}
这将 return 一个包含 <ul>
的所有子元素的数组。
问题是,当您期望 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' ]