如何用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
相关产品推荐
相关产品推荐

