首页 > 解决方案 > 使用 NodeJS、Nightmare 和 Cheerio 抓取 JS 站点

问题描述

我正在尝试抓取一个网站以获取每个团队的分数。我遇到了我的脚本返回空内容的问题。我看不出哪里出错并寻求帮助。

JS:

const Nightmare = require('nightmare')
const cheerio = require('cheerio');
const fs = require('fs');


const nightmare = Nightmare({ show: true })
const url = 'https://www.mscl.org/live/scorecard/ed7941919f69b0e11e800fef/mHcehsPR9S86T3zQv';

nightmare
  .goto(url)
  .wait('body')
  .wait('div#summaryTab.tab-pane.fade.in.table-responsive.borderless.active')
  .evaluate(() => document.querySelector('div.col-md-6').innerHTML)
  .end()
  .then(response => {
    console.log(getData(response));
  }).catch(err => {
    console.log(err);
  });

  let getData = html => {
    data = [];
    const $ = cheerio.load(html);
    $('div').each((i, elem) => {
        if(i === 0 ){
          console.log($(elem).find('nth-child(1)').html());
          
        }
    });
    return data;

  }

我正在抓取的 html 在这里。 https://pastebin.com/R6syWDwD

分数所在的行:30 和 32

      <div class="col-md-6">
        <b>40 Overs Match</b><br>
        <b>MVCC Combined</b> won the toss and chose Batting<br>
        <b>Umpires: </b>No umpires were selected<br>
        <b>Date: </b> 3/24/2021, 5:00:00 PM<br>
        <b>Ground: </b>Acton Field 1<br>
        <b>Result: TBD</b><br>
        <b>MoM: </b> <br>
        <hr>
        
        <p><b>MVCC COMBINED XI - 147/10</b> (<b>O:</b> 12.5 | <b>RR:</b> 11.45)</p>
        
        <p><b>MVCC United XI - 23/1</b> (<b>O:</b> 2.0 | <b>RR:</b> 11.50)</p>
        <hr>
      </div>

当我运行它时,它什么也不返回。也没有显示错误。我错过了什么?

标签: javascriptnode.js

解决方案


nth-child的jQuery 文档说

jQuery 对 :nth- 选择器的实现严格地源自 CSS 规范

因此,您可能必须为您的nth-child(1)-pseudo-selector 提供一个元素,以告诉 jQuery 它应该从哪个元素中选择第 n 个子元素。尝试这个:

console.log($(elem).find('b:nth-child(1)').html());

或者,只需尝试nth-child(1)使用冒号作为前缀 ->:nth-child(1)

编辑:

我刚刚意识到您在您选择的 div 上使用了 innerHTML,它实际上返回了 div 的内容,而没有包装 div 本身。但是在getData您尝试选择$('div')实际找不到的 div 。


推荐阅读