基于关键词的RSS过滤是指通过预设的关键词规则,对RSS订阅源返回的每一条内容进行检测,仅保留包含指定词语的项目,过滤掉不符合要求的内容,让用户可以精准获取自己感兴趣的资讯。这种方式能有效解决RSS订阅中信息杂乱的问题,适合需要定向获取特定领域内容的用户。

基于关键词的RSS过滤的核心原理
RSS源通常以XML格式输出内容,每一条项目(item)都包含标题、描述、发布时间等字段。基于关键词的过滤本质是对这些字段进行文本匹配,当匹配到预设的关键词时,就保留该条项目,否则直接丢弃。常见的匹配方式有两种:
- 精确匹配:要求内容中完全出现预设的关键词,比如关键词是“人工智能”,那么只有内容里包含这四个连续字符的项目才会被保留。
- 模糊匹配:可以通过正则表达式实现更复杂的匹配规则,比如匹配包含“AI”或者“人工智能”的项目,或者匹配以特定词语开头的标题。
使用Python实现简单的RSS关键词过滤
我们可以通过feedparser库解析RSS源,再结合字符串匹配或者正则表达式实现关键词过滤,以下是基础的实现代码:
import feedparser
import re
# 定义要过滤的关键词列表,支持正则表达式
KEYWORDS = [r"人工智能", r"机器学习", r"深度学习"]
# 要订阅的RSS源地址
RSS_URL = "https://example.ipipp.com/rss"
def filter_rss_by_keyword():
# 解析RSS源
feed = feedparser.parse(RSS_URL)
filtered_items = []
for entry in feed.entries:
# 提取标题和描述内容
title = entry.get("title", "")
summary = entry.get("summary", "")
content = title + " " + summary
# 遍历关键词进行匹配
for keyword in KEYWORDS:
if re.search(keyword, content):
filtered_items.append({
"title": title,
"link": entry.get("link", ""),
"published": entry.get("published", "")
})
break # 匹配到一个关键词就停止,避免重复添加
return filtered_items
if __name__ == "__main__":
result = filter_rss_by_keyword()
print(f"共筛选出{len(result)}条符合关键词的内容:")
for item in result:
print(f"标题:{item['title']}")
print(f"链接:{item['link']}")
print(f"发布时间:{item['published']}")
print("-" * 50)
常见RSS阅读器的内置过滤功能
如果不想自己写代码,很多成熟的RSS阅读器都内置了关键词过滤功能,操作更加简单:
| 阅读器名称 | 过滤功能说明 |
|---|---|
| Feedly | 支持创建自定义过滤规则,可设置包含或排除特定关键词,规则会自动应用到所有订阅源 |
| Inoreader | 提供高级过滤选项,除了关键词匹配,还支持按作者、标签、发布时间等维度组合过滤 |
| Miniflux | 开源自托管的RSS阅读器,支持基于关键词的全局过滤,配置后所有新获取的内容都会自动筛选 |
关键词过滤的注意事项
在使用基于关键词的RSS过滤时,需要注意以下几点:
- 避免关键词设置过于宽泛,比如只设置“技术”这类通用词,可能还是会筛选出大量不相关内容。
- 可以结合排除关键词规则,比如设置了“人工智能”作为包含关键词,同时设置“招聘”作为排除关键词,避免筛选出人工智能相关的招聘内容。
- 部分RSS源的description字段可能包含HTML标签,匹配前可以先对内容做去标签处理,避免关键词被标签打断无法匹配。
需要注意的是,RSS源的内容更新频率和内容格式可能存在差异,如果过滤后没有结果,可以先检查RSS源是否正常输出内容,再调整关键词的匹配规则。
进阶:结合多关键词的逻辑过滤
如果我们需要同时匹配多个关键词,比如要求内容同时包含“Python”和“爬虫”,可以调整匹配逻辑:
import feedparser
import re
# 定义必须同时包含的关键词
MUST_KEYWORDS = [r"Python", r"爬虫"]
# 定义可选包含的关键词,匹配任意一个即可
OPTIONAL_KEYWORDS = [r"Scrapy", r"Requests"]
def advanced_filter_rss():
feed = feedparser.parse("https://example.ipipp.com/rss")
filtered_items = []
for entry in feed.entries:
title = entry.get("title", "")
summary = entry.get("summary", "")
# 去除内容中的HTML标签,避免影响匹配
content = re.sub(r"<[^>]+>", "", title + " " + summary)
# 检查必须包含的关键词是否都存在
must_match = all(re.search(kw, content) for kw in MUST_KEYWORDS)
if not must_match:
continue
# 检查可选关键词是否有匹配
optional_match = any(re.search(kw, content) for kw in OPTIONAL_KEYWORDS)
if optional_match:
filtered_items.append({
"title": title,
"link": entry.get("link", "")
})
return filtered_items
if __name__ == "__main__":
items = advanced_filter_rss()
for item in items:
print(item["title"], item["link"])