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

Cheerio中如何用:nth-child单独提取各a标签href属性

问题根因
  • 原选择器逻辑错误::nth-child()匹配的是元素在其直接父节点下的排位,原代码写法是在每个li.list-inline-item.mr-3内部查找第1/2/3个<a>标签,但实际每个li标签下仅存在1个a标签,不存在排位为2、3的a节点,取属性时自然返回undefined。
  • 遗漏反爬配置:直接用默认axios配置请求目标站点会被拦截返回403页面,页面结构和预期不符也会导致匹配失败。
  • 匹配范围过宽:页面存在多个class为list-inline mb-0的ul标签,全局匹配容易命中非目标区域的元素。
修正后的代码
const axios = require('axios');
const cheerio = require('cheerio');
const fs = require('fs');
// 替换为你实际使用的写入流实例
const writeStream = fs.createWriteStream('./social_links.csv');

axios.get("目标代币页面地址", {
  headers: {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
  }
}).then(res => {
    const $ = cheerio.load(res.data);
    // 锚定社交链接所在的列表容器
    const socialList = $('div.col-md-8 ul.list-inline.mb-0');
    // 按顺序提取各平台链接
    const twitter = socialList.find('li.list-inline-item.mr-3').eq(0).find('a').attr('href');
    const discord = socialList.find('li.list-inline-item.mr-3').eq(1).find('a').attr('href');
    const opensea = socialList.find('li.list-inline-item.mr-3').eq(2).find('a').attr('href');
    
    writeStream.write(`${twitter}, ${discord}, ${opensea} \r\n`)
})
代码说明
  • 先定位到社交区域的父容器再做元素查找,缩小匹配范围,避免误选页面其他位置的同样式列表
  • 用Cheerio的.eq(index)方法按索引匹配列表项,索引从0开始计数,依次对应三个社交平台入口
  • 每个列表项下仅存在1个跳转a标签,直接取对应标签的href属性即可,不需要额外对a标签做位置匹配
  • 补充浏览器UA请求头,绕过站点基础反爬,避免拿到异常响应导致匹配失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 17:03:16