如何从HTML提取彩色状态文本并完善RSСF竞赛解析程序?
解决RSСF竞赛状态解析的AttributeError问题
问题说明
现有基于requests和BeautifulSoup的代码可正常从RSСF官网解析竞赛信息,但尝试提取带颜色标注的状态文本(绿色=正在接受申请、橙色=审核中、红色=已结束)时,触发AttributeError: 'NoneType' object has no attribute 'text'错误。
错误原因
不是所有竞赛条目同时包含.contest-success(绿色)、.contest-warning(橙色)、.contest-danger(红色)这三个类的元素——每个竞赛只会对应其中一个状态类。直接调用select_one('.xxx').text时,若当前条目没有对应类的元素,select_one会返回None,此时访问.text就会报错。另外你之前的错误代码里把橙色状态的类写错成了.contest-danger,正确类名是.contest-warning。
修正方案
先检查状态元素是否存在,再提取文本;或者直接从.contest-status容器内查找所有带状态类的元素,取第一个存在的即可,同时增加兜底处理避免极端情况出错。
修正后的完整代码
import requests from bs4 import BeautifulSoup import json import warnings warnings.filterwarnings("ignore") BASE_URL = 'https://www.rscf.ru/contests' session = requests.Session() session.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:100.0) Gecko/20100101 Firefox/100.0' items = [] max_page = 10 for page in range(1, max_page + 1): url = f'{BASE_URL}/?PAGEN_2={page}' if page > 1 else BASE_URL # 修正URL末尾多余斜杠 print(url) rs = session.get(url, verify=False) rs.raise_for_status() soup = BeautifulSoup(rs.content, 'html.parser') for item in soup.select('.classification-table-row.contest-table-row'): number = item.select_one('.contest-num').text.strip() title = item.select_one('.contest-name').text.strip() date = item.select_one('.contest-date').text.replace("\n", "").replace("Подать заявку", "").strip() documents = item.select_one('.contest-docs').text.replace("\n", " ").strip() # 提取带颜色的状态文本 status_container = item.select_one('.contest-status') # 按状态类型依次查找元素 status_element = (status_container.select_one('.contest-success') or status_container.select_one('.contest-warning') or status_container.select_one('.contest-danger')) synopsis = status_element.text.strip() if status_element else "未知状态" items.append({ 'Номер': number, 'Наименование конкурса': title, 'Приём заявок': date, 'Статус': synopsis, 'Документы': documents, }) with open('out.json', 'w', encoding='utf-8') as f: json.dump(items, f, indent=4, ensure_ascii=False)
关键修改点
- 修正分页URL末尾多余的斜杠,避免请求无效地址
- 对所有文本提取添加
.strip()清理多余空格和换行符 - 先获取状态容器,再依次查找对应状态类的元素,避免直接访问None的
.text属性 - 增加"未知状态"兜底处理,避免极端情况导致程序中断
内容的提问来源于stack exchange,提问作者Galo Galo
相关产品推荐
相关产品推荐

