RSS作为常用的内容订阅格式,很多站点会通过它推送文章、音视频等内容,其中媒体内容的提取是很多内容聚合类应用的核心需求。不同RSS源的媒体内容存放位置差异较大,有的放在description字段的HTML里,有的放在专门的media命名空间标签中,需要针对性的处理方案。

RSS中媒体内容的常见存放形式
要提取媒体内容,首先需要了解RSS中媒体内容的常见存储方式,主要有以下几类:
- 放在<description>或<content:encoded>字段的HTML代码里,以<img>、<video>、<audio>标签的形式存在
- 遵循Media RSS规范,使用<media:content>、<media:thumbnail>等带命名空间的标签存储
- 部分源会把媒体链接直接放在<enclosure>标签中,该标签常用于音频、视频等大文件的推送
基础提取方案:使用feedparser解析RSS
feedparser是Python中常用的RSS解析库,可以自动处理不同格式的RSS、Atom源,还能自动解析命名空间,大幅降低解析复杂度。首先安装该库:
# 安装feedparser库 pip install feedparser
解析RSS源并获取基础内容的代码示例如下:
import feedparser
# 解析RSS源,这里使用测试用的RSS地址
feed = feedparser.parse("http://ipipp.com/rss/test_feed.xml")
# 遍历所有文章条目
for entry in feed.entries:
print("文章标题:", entry.get("title"))
print("文章链接:", entry.get("link"))
# 获取描述内容,可能包含HTML格式的媒体标签
desc = entry.get("description", "")
# 获取content命名空间下的完整内容
content = entry.get("content", [{}])[0].get("value", "")
提取不同形式的媒体内容
1. 提取enclosure标签中的媒体
<enclosure>标签是RSS中专门用来附带媒体文件的标签,通常包含url、type、length等属性,提取逻辑最简单:
import feedparser
feed = feedparser.parse("http://ipipp.com/rss/test_feed.xml")
for entry in feed.entries:
# 检查是否存在enclosure属性
if "enclosures" in entry:
for enclosure in entry.enclosures:
media_url = enclosure.get("url")
media_type = enclosure.get("type")
if media_url:
print(f"找到enclosure媒体:{media_url},类型:{media_type}")
2. 提取Media RSS命名空间标签的内容
很多RSS源遵循Media RSS规范,使用<media:content>等标签存储媒体,feedparser会自动将这些标签解析为条目的属性:
import feedparser
feed = feedparser.parse("http://ipipp.com/rss/test_feed.xml")
for entry in feed.entries:
# 提取media:content标签内容
media_content = entry.get("media_content", [])
for media in media_content:
media_url = media.get("url")
media_medium = media.get("medium") # image/video/audio等
if media_url:
print(f"找到media标签媒体:{media_url},类型:{media_medium}")
# 提取media:thumbnail缩略图
thumbnails = entry.get("media_thumbnail", [])
for thumb in thumbnails:
thumb_url = thumb.get("url")
if thumb_url:
print(f"找到缩略图:{thumb_url}")
3. 从HTML内容中提取媒体标签
如果媒体内容存放在<description>或<content:encoded>的HTML里,需要解析HTML提取对应的标签,这里可以结合正则表达式或者HTML解析库处理,以下是用正则表达式提取图片链接的示例:
import feedparser
import re
feed = feedparser.parse("http://ipipp.com/rss/test_feed.xml")
# 匹配img标签的src属性的正则
img_pattern = re.compile(r'<img[^>]+src=["'](.*?)["'][^>]*>')
# 匹配video标签的src属性
video_pattern = re.compile(r'<video[^>]+src=["'](.*?)["'][^>]*>')
# 匹配audio标签的src属性
audio_pattern = re.compile(r'<audio[^>]+src=["'](.*?)["'][^>]*>')
for entry in feed.entries:
content = entry.get("content", [{}])[0].get("value", "") or entry.get("description", "")
# 提取所有图片链接
img_urls = img_pattern.findall(content)
# 提取所有视频链接
video_urls = video_pattern.findall(content)
# 提取所有音频链接
audio_urls = audio_pattern.findall(content)
if img_urls:
print(f"文章{entry.get('title')}中的图片:{img_urls}")
if video_urls:
print(f"文章{entry.get('title')}中的视频:{video_urls}")
if audio_urls:
print(f"文章{entry.get('title')}中的音频:{audio_urls}")
注意事项
- 不同RSS源的媒体标签属性可能有差异,比如有的<img>标签用data-src存储真实链接,需要根据实际情况调整正则规则
- 部分RSS源可能有访问限制,解析时建议添加超时处理,避免程序卡死
- 提取到的媒体链接建议做去重处理,避免同一篇文章重复提取相同的媒体内容
- 如果处理大量RSS源,建议添加异常捕获,避免单个源解析失败影响整体流程
提取RSS媒体内容的核心是先明确目标源的媒体存储格式,再选择对应的解析方式,优先使用feedparser处理标准标签,再针对性处理HTML内的媒体标签,就能覆盖绝大多数场景的需求。
RSS媒体内容提取XML解析feedparser正则表达式修改时间:2026-07-18 14:39:28