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

