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

