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

使用Cheerio与Node.js爬取SoccerWay时无法获取指定Select选项的问题

解决Cheerio爬取Soccerway俱乐部相关国家信息的问题

看起来你遇到的核心问题要么是静态抓取工具无法获取JS动态渲染的元素,要么是选择器因为网站结构更新失效了。我来一步步帮你排查和解决:

第一步:验证目标元素是否存在于静态HTML中

Soccerway的导航栏不少元素是通过JavaScript动态加载的,而request-promise只能抓取页面初始的静态HTML,这会导致你用Cheerio找不到后续渲染出来的元素。

先修改代码把页面保存到本地,确认目标select是否在静态内容里:

const rp = require('request-promise');
const fs = require('fs');

const options = { uri: 'https://uk.soccerway.com/' };
rp(options)
 .then((body) => {
    fs.writeFileSync('soccerway-static.html', body);
    console.log("静态页面已保存,打开后搜索目标select元素是否存在");
 })
.catch((err) => { console.log(err); })

如果打开保存的HTML后找不到那个select,说明它是JS动态生成的,这时候Cheerio就无能为力了,需要换用能模拟浏览器的工具。

第二步:用Puppeteer抓取动态渲染的内容

Puppeteer可以模拟真实浏览器加载页面,等待JS渲染完成后再获取元素,是解决动态页面抓取的常用方案:

首先安装Puppeteer:

npm install puppeteer

然后用以下代码获取俱乐部相关的国家选项:

const puppeteer = require('puppeteer');

(async () => {
  // 启动浏览器(headless: true 为无界面模式,设为false可以看到浏览器窗口)
  const browser = await puppeteer.launch({ headless: true });
  const page = await browser.newPage();
  
  // 访问目标页面,等待网络请求基本完成
  await page.goto('https://uk.soccerway.com/', { waitUntil: 'networkidle2' });

  // 等待目标select元素加载完成(用data属性定位,比依赖父元素索引更稳定)
  await page.waitForSelector('select[data-dropdown-current="country"]');

  // 在浏览器环境中提取所有非空的option值
  const countryList = await page.evaluate(() => {
    const options = Array.from(document.querySelectorAll('select[data-dropdown-current="country"] > option'));
    return options.map(opt => opt.value).filter(val => val.trim() !== '');
  });

  console.log("俱乐部相关的国家信息:", countryList);
  await browser.close();
})();

这里用data-dropdown-current="country"这个属性定位select,比依赖父元素的位置更可靠,能避免网站结构微调导致选择器失效。

第三步:如果静态页面存在元素,修正Cheerio选择器

如果静态HTML里确实有目标元素,那大概率是你的选择器不正确。Cheerio的:eq()是从0开始计数的,而CSS的:nth-child()是从1开始,网站结构更新后原来的索引可能已经失效。建议用更具体的属性来定位:

rp(options)
 .then(($) => {
    // 用data属性定位select,再遍历option
    $('select[data-dropdown-current="country"] > option').each(function() {
      const val = $(this).val();
      if(val) console.log(val);
    });
 })
.catch((err) => { console.log(err); })

这样不管父元素位置怎么变,只要select的data属性不变,就能稳定定位到目标元素。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:41:43