You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 19:01:29