RSS是什么

RSS 链接就是一个以 .xml.rss 结尾的网址(也可能隐藏在 /?feed=rss2 这类路由里),把它放进RSS 阅读器后,阅读器就能自动抓取这个网站的最新文章/更新,不用一个个网站去刷新。

Python访问RSS链接,获取到各种信息

方法:feedparser库+自扩展

常规的RSS链接:

RSS 2.0 中 一个 <item>(即一条内容) 的常见字段:

字段名 说明
<title> 标题【必需】
<link> 原始链接【必需】
<description> 摘要或全文【必需,可以是纯文本或HTML】
<pubDate> 发布日期(符合RFC822格式,如Wed,23Jul202512:00:00GMT)
<guid> 内容的唯一标识符(可以是链接或自定义ID)
<author> 作者邮箱 (非必须)
<category> 内容分类 (可重复)
<comments> 评论页面的链接
<enclosure> 附件(如下载文件、播客音频),需指定url、type、length
<source> 内容来源的RSS链接

进阶1:识别content:encoded字段的内容

motivation:机器之心(jiqizhixin.com/rss)会把全文放在<content:encoded>字段中,但是feedparser库识别不到

response_text = await fetch_rss(rss_url)
feed = feedparser.parse(response_text)
if feed.bozo:
     return {
          "entries": None,
          "error": f"Failed to parse RSS: {feed.bozo_exception}"
     }

# 根据机器之心改一下逻辑
# 用 ElementTree 解析原始 XML,处理 content:encoded(机器之心正文在<content:encoded>字段里面了)
root = ET.fromstring(response_text)
# 命名空间定义
namespaces = {
      'content': 'http://purl.org/rss/1.0/modules/content/'
}
# 构造 guid -> content 映射(或用 link 做主键)
content_map = {}
for item in root.findall('./channel/item'):
      guid = item.find('guid').text if item.find('guid') is not None else None
      content_node = item.find('content:encoded', namespaces)
      content_text = content_node.text if content_node is not None else ''
      content_map[guid] = content_text
# 提取条目内容
entries = []
for entry in feed.entries:
    summary = entry.get("summary", "No summary available")

    # 机器之心的特殊逻辑
    guid = entry.get('id') or entry.get('link')
    content = content_map.get(guid, '')
    content = content.replace('<![CDATA[', '').replace(']]>', '')

进阶2:识别图片

先尝试从enclosure中获取图片,如果没有的话,再使用BeautifulSoup库

BeautifulSoup的核心作用

  • 解析杂乱的 HTML/XML:即使网页不规范(标签未闭合、嵌套错误),也能正确解析。

  • 像 CSS 选择器一样查找元素:支持 .find().find_all()、CSS 选择器(.select())等方法。

  • 无需正则:避免用正则表达式手动处理 HTML 字符串。

from bs4 import BeautifulSoup

def get_feed_images(entry):
    # 从enclosure获取图片
    if 'enclosures' in entry and len(entry.enclosures) > 0:
        for enclosure in entry.enclosures:
            if 'image' in enclosure.get('type', ''):
                img_res = enclosure.get('url', '')
                return img_res

    # 从内容中提取图片
    content = ''
    if 'content' in entry and len(entry.content) > 0:
        content = entry.content[0].get('value', '')
    elif 'description' in entry:
        content = entry.description

    # 用BeautifulSoup解析 HTML 内容
    if content:
        soup = BeautifulSoup(content, 'html.parser')
        img_tag = soup.find('img')

        if img_tag and img_tag.get('src'):
            img_url = img_tag.get('src')
            return img_url

    return None

RSS订阅源

1. RSSEverything  Shared Feeds - Rss Everything 【自定义】

优点:支持自定义字段,可以无限添加

缺点:免费额度很少

2. 今天看啥   

优点:公众号RSS订阅源

缺点:没法自定义,就只能拿网站已有的

3. wewe-rss 【自定义】【公众号】rachelos/we-mp-rss: 高效订阅微信公众号,微信公众号订阅,更新最新文章,并生成RSS书签,支持Webhook/API接入

优点:按github教程部署docker-compose,开箱即用

           背靠微信读书,添加账号,输入公众号url之后就可以订阅任何公众号

缺点:目前的版本没法识别图片,并且会漏掉一些文章

4. 待探索:easychen/ai-rss: AI时代的RSS生成器

5. 一个不算RSS,但是可以实现读取链接的工具:coze的【链接抓取】工作流,但是准确性有待测试

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐