如何基于条件从Atom Feed中提取指定信息?
解决Atom Feed条目字段提取及缺失值填充问题
问题背景
需要从API返回的Atom Feed数据的每个<atom:entry>中提取以下内容:
<c:series>标签的href属性值<c:series-order>标签的文本内容(日期)<f:assessment-low>标签的文本内容(价格)
部分条目存在有日期但无价格的情况,需要在价格缺失时自动填充N/A,但原代码因全局提取所有对应标签,导致各字段列表长度不一致,无法正确匹配条目数据。
原代码问题分析
原代码通过soup.find_all()分别全局提取所有目标标签,再将文本/属性存入不同列表。这种方式无法保证每个条目对应的三个字段一一对应——当某个条目缺少<f:assessment-low>时,p_val列表的长度会小于p_day和q_val,最终导致数据错位。
修正方案:按条目遍历提取
正确的做法是遍历每个<atom:entry>,在每个条目内部单独提取三个字段,确保每个条目对应一组完整数据,缺失字段自动填充N/A。
修正后的代码
from bs4 import BeautifulSoup soup = BeautifulSoup(request.text, "html.parser") entries = soup.find_all('atom:entry') # 获取所有entry条目 p_day = [] p_val = [] q_val = [] for entry in entries: # 提取日期:每个entry里找c:series-order,找不到则填充N/A date_tag = entry.find('c:series-order') p_day.append(date_tag.text.strip() if date_tag else "N/A") # 提取价格:找不到f:assessment-low则填充N/A price_tag = entry.find('f:assessment-low') p_val.append(price_tag.text.strip() if price_tag else "N/A") # 提取series的href:找不到则填充N/A series_tag = entry.find('c:series') q_val.append(series_tag.get('href') if series_tag else "N/A") d2 = { 'date': p_day, 'price': p_val, 'quote': q_val }
代码说明
- 先获取所有
<atom:entry>标签,确保遍历的单位是每个独立条目 - 对每个条目,使用
find()而非find_all()查找对应字段(每个条目应仅含一个目标字段) - 通过三元表达式判断标签是否存在:存在则提取内容,不存在则填充
N/A - 最终三个列表的长度完全一致,每个索引对应同一个条目的三个字段
内容的提问来源于stack exchange,提问作者Jack Miller
相关产品推荐
相关产品推荐

