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

