无法获得特定的div选项

时间:2018-03-29 19:13:08

标签: jquery node.js cheerio

我正在构建一个非常简单的抓取工具,应该将此website上的所有国家/地区都用掉。这些国家/地区位于“国内俱乐部”下拉列表中。

对于coutnries,我正在使用Nodejs cheerio(我不知道该库是否是一个不错的选择,我是一个非常初学者)。

这是我的代码:

const request = require('request');

var cheerio = require('cheerio');
var cheerioAdv = require('cheerio-advanced-selectors');

request('https://uk.soccerway.com/', function(err, resp, html)
{
  if (!err)
  {
    const $ = cheerio.load(html);

    var countriesMenu = cheerioAdv.find($, '#navbar-left > div:eq(2)');

    $(countriesMenu).each(function()
    {
      console.log($(this).val());
    });
  }
});

基本上我声明了一个名为request的常量,它执行所有请求GET。然后我声明了另外两个包含库cheerio和另一个名为cheerioAdv的变量,并且应该允许我完成此任务。

cheerio advanced selector应该允许我访问特定的标记位置。

根据该解释,我保存了navbar-left的第二个div的内容,其中包含我想要的所有选项国家。

当我使用以下命令启动脚本时:node app.js不打印任何内容。我还尝试在options之后添加eq(2),我做错了什么?

1 个答案:

答案 0 :(得分:0)

request模块实际上并未包含#navbar-left。如果您尝试console.log(html),您会注意到html数据有点奇怪。那是因为请求模块只能渲染初始的html体,而不能渲染javascript渲染的数据,如ajax或react / angular。尝试使用request以外的其他模块。也许使用无头浏览器。 Nightmare是一个很棒的人。

npm install nightmare --save

您使用梦魇实例拨打电话,然后将html代码传递给您的cheerio。以下是样本:

const Nightmare = require('nightmare')
const nightmare = Nightmare({ show: true })
const cheerio = require('cheerio');

nightmare
    .goto(url)

    //do something in the chain to go to your desired page.

   .evaluate(() => document.querySelector('html').outerHTML) // html selector

   .then(function (html) {
      cheerio.load(html);
      // DO SOMETHING IN CHEERIO HERE

    )
    .catch(function (error) {
    console.error('Error:', error);
    });