You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Cheerio在Node.js中提取赛事数据失败,求排查解决

问题排查与修正方案

控制台输出1说明你的根选择器匹配到了1个元素,但空数组意味着each循环里没有正确提取到子元素数据,大概率是子元素选择器不匹配,或者根选择器匹配的是父容器而非单个赛事项。

1. 先确认根选择器的正确性

假设你的网页HTML片段结构如下(结合常见赛事列表结构):

<div class="competition-wrap">
  <div class="match-item">
    <span class="team-text">Barcelona vs Real Madrid</span>
    <time class="match-time">2024-06-10 21:00</time>
    <span class="field-name">Camp Nou</span>
  </div>
  <div class="match-item">
    <span class="team-text">Juventus vs AC Milan</span>
    <time class="match-time">2024-06-11 19:45</time>
    <span class="field-name">Allianz Stadium</span>
  </div>
</div>

如果你的根选择器写的是$('.competition-wrap'),那它只会匹配1个父容器,而非每个赛事项,each循环只会执行一次,且内部子元素选择器会提取所有匹配文本,而非单条赛事数据——这就会导致你看到的1(父容器数量)和空数组(若子选择器也错误)。

正确的根选择器应该直接匹配单个赛事项的容器,比如上面的.match-item。

2. 修正后的完整代码

const cheerio = require('cheerio');
// 替换为你的网页HTML内容
const html = `
<div class="competition-wrap">
  <div class="match-item">
    <span class="team-text">Barcelona vs Real Madrid</span>
    <time class="match-time">2024-06-10 21:00</time>
    <span class="field-name">Camp Nou</span>
  </div>
  <div class="match-item">
    <span class="team-text">Juventus vs AC Milan</span>
    <time class="match-time">2024-06-11 19:45</time>
    <span class="field-name">Allianz Stadium</span>
  </div>
</div>
`;

const $ = cheerio.load(html);
const matchData = [];

// 根选择器直接匹配每个赛事项容器
$('.match-item').each((_, el) => {
  // 限定在当前赛事项范围内查找子元素,避免全局匹配
  const teamName = $(el).find('.team-text').text().trim();
  const time = $(el).find('.match-time').text().trim();
  const veld = $(el).find('.field-name').text().trim();

  // 过滤空数据,避免无效条目
  if (teamName && time && veld) {
    matchData.push({ teamName, time, veld });
  }
});

console.log(JSON.stringify(matchData, null, 2));

3. 关键注意事项

  • 限定选择器范围:必须用$(el)来限定查找范围,否则$('.team-text')会匹配页面所有对应元素,而非当前赛事项的子元素。
  • 验证匹配数量:循环前可打印console.log($('.match-item').length),确认是否和预期的赛事数量一致。
  • 处理空文本:添加字段非空判断,避免把无效数据推入数组。

4. 适配你的实际HTML结构

如果你的页面结构不同,只需要替换对应的选择器:

  • 把.match-item换成你页面中单个赛事项的容器类名/标签选择器
  • 把.team-text、.match-time、.field-name分别替换为对应teamName、time、veld字段的元素选择器

执行后会生成符合要求的JSON:

[
  {
    "teamName": "Barcelona vs Real Madrid",
    "time": "2024-06-10 21:00",
    "veld": "Camp Nou"
  },
  {
    "teamName": "Juventus vs AC Milan",
    "time": "2024-06-11 19:45",
    "veld": "Allianz Stadium"
  }
]

内容的提问来源于stack exchange,提问作者Arjan_IO

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 21:55:49