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

如何使用Cheerio提取HTML的script标签内的JavaScript变量

解决方法

核心原因

你当前的问题根源是got请求返回的data不是纯HTML文本,而是got封装的完整Response对象,直接传给cheerio.load无法正常解析DOM结构,所以会出现$('script')长度为0、返回空数组的情况。

修正后代码

const got = require('got');
const cheerio = require('cheerio');
const vm = require('vm'); // Node内置模块,用来安全执行script内的代码提取变量

(async () => {
  const itemDetailURL = '你的商品ID'; // 替换为实际的参数值
  // 1. 正确获取HTML文本
  const htmlText = await got(`https://www.vvic.com/item/${itemDetailURL}.html`, {
    // 可选配置:加请求头避免反爬拦截,和Postman的请求头保持一致即可
    headers: {
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36'
    },
    decompress: true // 自动处理gzip压缩的响应内容
  }).text();

  // 2. 解析DOM
  const $ = cheerio.load(htmlText);
  // 取第一个script标签的文本内容
  const targetScript = $('script').eq(0).text();

  // 3. 提取变量:用vm沙箱执行代码,不需要手动正则匹配,也比eval安全
  const sandbox = {};
  vm.runInNewContext(targetScript, sandbox);

  // 直接获取所需变量
  console.log(sandbox._ITEMID);
  console.log(sandbox.ITEM_VID);
  console.log(sandbox._DISCOUNTPRICE);
  console.log(sandbox._SIZE);
})();

可选兜底方案

如果部分场景下vm执行不符合预期,也可以用正则匹配提取对应变量的值,示例:

// 匹配_ITEMID的值
const itemIdMatch = targetScript.match(/var _ITEMID = '([^']+)'/);
const _ITEMID = itemIdMatch ? itemIdMatch[1] : null;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 19:06:04