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

Python使用BeautifulSoup+Selenium爬取Oddsportal时league字段重复问题

问题根因

你当前的错误核心是直接从页面头部取固定位置的联赛值count[1].text给所有行复用,没有跟着表格内的联赛头行更新联赛变量。Oddsportal的赛事表结构是:先出现一行「国家 » 联赛」的头行,下面跟着该联赛的所有赛事,你的代码里只在头行更新了国家值,没有同步更新联赛值。

修改方案
  1. 在parse_data函数里新增current_league变量存储当前遍历到的联赛
  2. 遇到联赛头行(即:不在row[1]的行)时,拆分出头行的国家和联赛,分别赋值给对应的变量
  3. 遍历赛事行时,把当前current_league的值添加到league数组中,替换原来的固定count[1].text

修改后的parse_data完整代码如下:

def parse_data(html):
    df = pd.read_html(html, header=0)[0]
    html = browser.page_source
    soup = bs(html, "lxml")
    cont = soup.find('div', {'id': 'wrap'})
    content = cont.find('div', {'id': 'col-content'})
    content = content.find('table', {'class': 'table-main'}, {'id': 'table-matches'})
    main = content.find('th', {'class': 'first2 tl'})

    if main is None:
        return None

    count = main.findAll('a')
    # 初始化国家和联赛变量,用页面第一个联赛做初始值
    current_country = count[0].text
    current_league = count[1].text
    game_data = GameData()
    game_date = datetime.strptime(soup.select_one('.bold')['href'].split('/')[-2], '%Y%m%d').date()

    for row in df.itertuples():
        if not isinstance(row[1], str):
            continue
        elif ':' not in row[1]:
            # 遇到联赛头行,拆分更新国家和联赛
            parts = row[1].split('»')
            current_country = parts[0].strip()
            current_league = parts[1].strip() if len(parts)>=2 else current_league
            continue
        game_time = row[1]
        score = row[3] if row[3] else nan

        game_data.date.append(game_date)
        game_data.time.append(game_time)
        game_data.country.append(current_country)
        # 替换为当前遍历到的动态联赛变量
        game_data.league.append(current_league)
        game_data.game.append(row[2])
        game_data.score.append(score)
        game_data.home_odds.append(row[4])
        game_data.draw_odds.append(row[5])
        game_data.away_odds.append(row[6])

    return game_data
核心修改点
  • 新增了current_league变量存储当前生效的联赛值
  • 头行处理逻辑补充了联赛值的提取和更新
  • 联赛字段的赋值从固定取count[1].text改为取动态更新的current_league

修改后遍历赛事时,会自动跟着表格内的联赛头切换联赛值,不会出现全页联赛重复的问题。

内容的提问来源于stack exchange,提问作者PyNoob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 06:06:08