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

如何用CheerioJS判断指定球队赛事的购票按钮是否可用

问题:用Node.js + CheerioJS检测Team 1赛事的可购票状态

我想用Node.js和CheerioJS编写脚本,检测网站中Team 1球队的赛事是否有票可购。网站的基础HTML结构如下:

<body>
    <div class="competition">
      <div class="match">
        <div class="team-info">
          <h3>
            <span class="team">Team 1</span>
            <span class="team">Team 2</span>
          </h3>
        </div>
        <div class="buy-info">
          <div class="btn available">Buy</div>
        </div>
      </div>
      <div class="match">
        <div class="team-info">
          <h3>
            <span class="team">Team 3</span>
            <span class="team">Team 4</span>
          </h3>
        </div>
        <div class="buy-info">
          <div class="btn available">Buy</div>
        </div>
      </div>
    </div>
  </body>

我原本计划通过each()函数遍历每个.match类元素,当该赛事包含文本为Team 1的.team标签,且对应的Buy按钮带有available类时计数,但实际运行时返回结果是所有available按钮的数量乘以Team 1的赛事数量,存在明显问题。我的代码如下:

const teamFinder = ".team";
// set match day class
const match = ".match";
let MatchCount = 0;

$(match).each((MDIdx, MDElm) => {
  $(teamFinder).each((parentIdx, parentElm) => {
    let team = $(parentElm).text();

    if (team == "Team 1") {
      if ($(buttonDiv).children().hasClass("available")) {
        MatchCount++;
      }
    }
  });
});

问题原因

嵌套遍历时,内层的$(teamFinder)没有限定在当前的.match元素范围内,会遍历页面上所有.team元素;同时buttonDiv未关联当前赛事,导致每次匹配到Team 1时,都会统计所有带available类的按钮,最终出现重复计数的问题。

修正后的代码

const cheerio = require('cheerio');
// 替换为你实际获取到的页面HTML内容
const html = '<body>...</body>';
const $ = cheerio.load(html);

const matchSelector = ".match";
let availableMatchCount = 0;

$(matchSelector).each((idx, matchElm) => {
  // 仅在当前赛事元素内精确匹配Team 1
  const hasTeam1 = $(matchElm).find(".team").filter((_, elm) => $(elm).text() === "Team 1").length > 0;
  // 检查当前赛事的购票按钮是否有available类
  const hasAvailableTickets = $(matchElm).find(".buy-info .btn").hasClass("available");

  if (hasTeam1 && hasAvailableTickets) {
    availableMatchCount++;
  }
});

// 输出结果:有票的赛事数量
console.log(`Team 1可购票的赛事数:${availableMatchCount}`);
// 若只需判断是否存在可购票赛事,直接返回 availableMatchCount > 0

关键优化点

  • 所有查找操作都限定在当前.match元素内,避免全局遍历导致的重复统计
  • 用filter()精确匹配Team 1的文本,避免因文本包含导致的误判
  • 简化逻辑层级,提升代码可读性和执行效率

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 12:05:27