如何使用Cheerio在网页<a>标签中检测多个关键词?
Cheerio 实现多关键词查找标签
Cheerio完全支持查找包含任一目标关键词的元素,以下是两种实用实现方法:
方法1:多:contains选择器组合
Cheerio兼容jQuery的选择器语法,用逗号分隔多个:contains()选择器,即可匹配满足任一关键词的标签:
修改后的核心代码片段:
// 替换原选择器,同时匹配含climate或environment的a标签 $('a:contains("climate"), a:contains("environment")').each(function(){ const title = $(this).text().trim(); const url = $(this).attr('href'); articles.push({ title, url }); })
方法2:filter()自定义筛选(更灵活)
如果需要不区分大小写匹配、关键词数量较多,推荐用filter()方法自定义筛选逻辑:
$('a').filter(function() { // 统一转小写,避免大小写遗漏匹配 const text = $(this).text().toLowerCase(); return text.includes('climate') || text.includes('environment'); }).each(function(){ const title = $(this).text().trim(); const url = $(this).attr('href'); articles.push({ title, url }); })
完整修复后的代码
注意:原代码中articles是全局变量,多次请求/news会导致数据重复,建议将其放在路由内部初始化:
const PORT = 8000; const express = require('express'); const axios = require('axios'); const cheerio = require('cheerio'); const app = express(); app.get('/',(req,res)=>{ res.json('Hello World') }) app.get('/news',(req,res)=>{ // 每次请求初始化数组,避免重复数据 const articles = []; axios.get('https://www.tbsnews.net/bangladesh/environment/climate-change') .then((response)=>{ const html = response.data; const $ = cheerio.load(html); // 使用方法1的多选择器 $('a:contains("climate"), a:contains("environment")').each(function(){ const title = $(this).text().trim(); const url = $(this).attr('href'); // 过滤空标题或空链接 if(title && url){ articles.push({ title, url }); } }) res.json(articles) }).catch((err)=>console.log(err)); }) app.listen(PORT,()=>{console.log(`server running on Port ${PORT}`)});
内容的提问来源于stack exchange,提问作者Mohammad Mustak Absar Khan
相关产品推荐
相关产品推荐

