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

如何用Cheerio获取无唯一标识符的特定元素值?

解决Cheerio提取Battlemetrics服务器玩家数量的问题

问题根源

  1. <dd>是普通文本元素,不能用.val()——这个方法仅针对input、select这类表单控件,普通元素的文本内容要靠.text()获取。
  2. .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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 17:20:31