如何使用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
相关产品推荐
相关产品推荐

