Python遍历提取RSS源x-trumba自定义场地地址方法
提取带命名空间RSS场地地址的实现方法
两种方案都可以直接嵌入你现有的遍历筛选流程,不需要改动原有已跑通的日期筛选、字段提取逻辑。
方案1:直接用feedparser原生能力读取(推荐,性能最好)
feedparser默认会自动解析所有带命名空间的自定义字段,XML标签里的冒号会被替换成下划线作为条目属性名,不需要额外引入BS4二次解析。
注意你要找的x-trumba:customfield同名标签在单个item下有多个,feedparser会把它们解析成列表,遍历匹配id为22505(对应Venue address)的字段取值即可。
修改后的完整逻辑如下:
import feedparser import datetime import html2text # 初始化存储列表 post_list = [] description_list = [] link_list = [] venue_address_list = [] # 新增场地地址存储列表 counter = 0 blog_feed = feedparser.parse(RSS源地址) posts = blog_feed.entries for post in posts: title = post.title word = posts[counter] counter += 1 date_str = word.category link = word.link # 原有日期处理逻辑完全保留 date_processed = date_str.split(' (')[0] event_date = datetime.datetime.strptime(date_processed, "%Y/%m/%d").date() if start_date < event_date < end_date: post_list.append(title) # 原有描述处理逻辑保留 h = html2text.HTML2Text() h.ignore_links = True description = h.handle(post.summary) description_list.append(description) link_list.append(link) # 新增场地地址提取逻辑 venue_address = "" # 遍历当前条目下所有trumba自定义字段 for custom_field in post.x_trumba_customfield: if custom_field.get("id") == "22505": venue_address = custom_field.get("value", "") break venue_address_list.append(venue_address)
如果不确定字段名,可以在循环里加一句print(post.keys()),就能看到所有feedparser解析完成的字段名,所有x-trumba开头的标签都会转成x_trumba_前缀的属性。
方案2:嵌入BS4解析逻辑(适配你已测试通的BS4写法)
如果不想适配feedparser的字段规则,可以一次性把RSS内容解析成BS4对象,按索引和feedparser的条目一一对应,避免每次循环重复加载文件。
实现代码如下:
from bs4 import BeautifulSoup import feedparser import datetime import html2text import requests # 拉取RSS原始内容,同时给feedparser和BS4解析 resp = requests.get(RSS源地址) rss_raw = resp.text blog_feed = feedparser.parse(rss_raw) posts = blog_feed.entries soup = BeautifulSoup(rss_raw, "html.parser") all_item_nodes = soup.find_all("item") # 和posts列表顺序完全一一对应 # 初始化存储列表 post_list = [] description_list = [] link_list = [] venue_address_list = [] counter = 0 for post in posts: title = post.title word = posts[counter] current_item = all_item_nodes[counter] # 取当前条目对应的原始XML节点 counter += 1 date_str = word.category link = word.link # 原有日期处理逻辑保留 date_processed = date_str.split(' (')[0] event_date = datetime.datetime.strptime(date_processed, "%Y/%m/%d").date() if start_date < event_date < end_date: post_list.append(title) # 原有描述处理逻辑保留 h = html2text.HTML2Text() h.ignore_links = True description = h.handle(post.summary) description_list.append(description) link_list.append(link) # 用你之前测试通的BS4逻辑提取地址 address_node = current_item.find("x-trumba:customfield", id="22505") venue_address = address_node.text if address_node else "" venue_address_list.append(venue_address)
小优化提示
你现在手动维护counter计数的写法可以替换成Python内置的enumerate,避免计数错位、初始化错误的问题,改完不需要手动写counter累加:
for idx, post in enumerate(posts): current_item = all_item_nodes[idx] date_str = post.category link = post.link title = post.title # 后续处理逻辑不变
内容的提问来源于stack exchange,提问作者VXA
相关产品推荐
相关产品推荐

