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

web scraping数据抓取时出现ReferenceError: Terminal A未定义怎么解决

问题根因

你的报错由两个核心代码问题共同触发:

  • 变量作用域错误:你用const声明的terminalA/terminalB/terminalCD三个变量,仅在$('.terminal-left').each()的回调函数作用域内有效,作用域外部无法访问这些变量
  • 异步执行逻辑错误:request是异步网络请求,你把writeStream.write()写在请求回调的外部,代码执行时会先运行写入操作,此时网络请求还没有返回结果,变量完全没有被赋值

另外你还存在一个隐藏逻辑漏洞:三个终端的取值代码完全一致,都是取同一个.terminal-percentage节点的文本,最终三个变量的取值会完全重复,无法拿到三个航站楼的不同数据。

修复后的完整代码
const fs = require('fs');
const request = require('request');
const cheerio = require('cheerio');
// 提前初始化写入流
const writeStream = fs.createWriteStream('terminal_parking.csv');
// 写入表头
writeStream.write(`Terminal A,Terminal B,Terminal C/D \n`);

var minutes = 1, timerInerval = minutes * 60 * 1000;

function TerminalOccupancyData() {
  request('https://www.laguardiaairport.com/to-from-airport/parking', (error, response, html) => {
    // 无报错且请求成功时执行解析逻辑
    if (!error && response.statusCode == 200) {
      const $ = cheerio.load(html);
      // 将变量声明提到each方法外部,作用域覆盖整个请求回调
      let terminalA, terminalB, terminalCD;
      // 根据下标匹配不同航站楼的取值
      $('.terminal-left').each((index, el) => {
        const percent = $(el).find('.terminal-percentage').text().replace(/% Full/, '');
        if(index === 0) terminalA = percent;
        if(index === 1) terminalB = percent;
        if(index === 2) terminalCD = percent;
      });
      console.log('\nTerminal Data scraped ... \n');
      // 写入操作移到请求回调内部,保证拿到数据后再执行写入
      writeStream.write(`${terminalA},${terminalB},${terminalCD} \n`);
    }
  });
}

setInterval(TerminalOccupancyData, timerInerval);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 14:24:04