如何用Cheerio获取无唯一标识符的特定元素值?
解决Cheerio提取Battlemetrics服务器玩家数量的问题
问题根源
<dd>是普通文本元素,不能用.val()——这个方法仅针对input、select这类表单控件,普通元素的文本内容要靠.text()获取。.server-info下包含多个<dd>元素,直接find('dd')会拿到所有相关节点,必须精准定位到玩家数量对应的目标元素。
修正后的极简代码
const URL = 'https://www.battlemetrics.com/servers/dayz/16108490'; axios(URL) .then(response => { const html = response.data const $ = cheerio.load(html) // 直接定位到"Players"对应的dd元素 const playerCount = $('dt:contains("Players") + dd').text().trim(); console.log('当前玩家数:', playerCount); }).catch(err => console.log(err))
代码逻辑说明
dt:contains("Players"):匹配文本内容为"Players"的<dt>标签+ dd:选择该<dt>的下一个相邻兄弟元素<dd>,也就是存储玩家数量的目标节点.trim():去除文本前后的空白字符,避免拿到多余的换行或空格
保留遍历逻辑的调整方案
如果想保留原有遍历.server-info的逻辑,可以这样修改:
const URL = 'https://www.battlemetrics.com/servers/dayz/16108490'; axios(URL) .then(response => { const html = response.data const $ = cheerio.load(html) const players = [] $('.server-info dl').each(function() { const dtText = $(this).find('dt').text().trim(); // 只提取Players对应的数值 if (dtText === 'Players') { const pNum = $(this).find('dd').text().trim(); players.push({ category: dtText, count: pNum }); } }) console.log(players) }).catch(err => console.log(err))
这样就能精准拿到目标数值,不会再出现undefined的情况。
内容的提问来源于stack exchange,提问作者Doki
相关产品推荐
相关产品推荐

