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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 23:03:18