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

使用Scrape-It与TypeScript时遇类型不兼容错误求助

解决Scrape-It与TypeScript的类型不兼容问题

你的类型错误核心原因是Scrape-It的ScrapeOptions对列表抓取项的data字段格式有严格要求——你当前使用的字符串数组['b']完全不符合它的类型定义。下面是具体的问题分析和修复方案:

错误原因拆解

Scrape-It中,当你定义一个列表抓取项(比如代码里的sports)时,data字段必须是键值对对象,而非字符串数组。每个键对应你想要提取的字段名称,值可以是选择器字符串,或者包含selector、attr、text等属性的配置对象。你当前的写法data: ['b']不满足ScrapeOptionList的类型规范,因此TypeScript抛出了类型不兼容错误。

修复后的完整代码

假设你想要抓取.LSport下<b>元素的文本内容,调整scrape-it的配置格式即可解决问题:

firebaseAdmin.firestore().collection('arenas').get()
  .then((snapshot) => {
    snapshot.forEach((element) => {
      const targetUrl = `${firebaseFunctions.config().sports.url}${element.data().url}`;
      scrapeIt(targetUrl, {
        sports: {
          listItem: '.LSport',
          data: {
            // 自定义字段名,值为要抓取的元素选择器
            boldContent: 'b'
            // 如果需要抓取元素属性(比如href),可以这样写:
            // link: { selector: 'a', attr: 'href' }
          }
        }
      }).then((data) => {
        // 注意要取data.sports,对应你配置的抓取键名
        sportsArray.push(data.sports);
        // 去重操作应该基于整个数组,而非单条data
        sportsArray = [...new Set(sportsArray)];
      }).catch((err) => { 
        res.send(err); 
        console.log(err);
      });
    });
  }).catch((err) => { 
    res.send(err); 
    console.log(err);
  });

额外的类型优化建议

为了让代码更规范、类型更安全,你可以做这些优化:

  • 避免滥用any类型:给snapshot指定firebase-admin/firestore的QuerySnapshot类型,给element指定QueryDocumentSnapshot类型。
  • 定义抓取结果的接口:
    interface SportItem {
      boldContent: string;
    }
    
    interface ScrapedResult {
      sports: SportItem[];
    }
    
    然后在then((data: ScrapedResult) => { ... })中使用该接口。
  • 处理异步并发问题:当前forEach中的多个scrape-it调用是并行执行的,建议使用Promise.all等待所有请求完成,避免数据不一致。

内容的提问来源于stack exchange,提问作者Divan van Biljon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:41:58