如何使用javascript在ul中循环li

时间:2017-06-01 20:48:24

标签: javascript web-scraping web-deployment-project nightmare

我想在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>
  



2 个答案:

答案 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' ]