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

如何用BeautifulSoup在bestfightodds.com匹配对手与对应收盘赔率?

解决方案

核心思路是将单场比赛的对手信息与赔率绑定到同一个DOM容器中,不要单独遍历所有对手文本和所有赔率——这种方式必然会出现对应关系错乱的问题。以下是基于Python + BeautifulSoup的实现方案:

步骤说明

  1. 定位页面中每一场独立比赛的容器(比如表格行、独立div),确保对手名称和对应赔率都在这个容器内
  2. 遍历每个比赛容器,提取对手名称并与目标对手匹配(处理可能的昵称/别名)
  3. 在匹配成功的容器内,直接提取当前选手的收盘赔率
  4. 收集所有匹配到的赔率,返回结果列表

代码示例

import requests
from bs4 import BeautifulSoup

def fetch_odds_against_opponent(fighter_page_url, target_opponent):
    # 获取页面HTML
    resp = requests.get(fighter_page_url)
    soup = BeautifulSoup(resp.text, "html.parser")
    
    # 定位所有比赛条目(根据实际页面结构调整选择器,这里示例用表格行)
    fight_entries = soup.find_all("tr", class_="fight-row")
    matched_odds = []
    
    for entry in fight_entries:
        # 提取对手名称,处理带昵称的情况(比如"Daniel 'DC' Cormier")
        opponent_elem = entry.find("td", class_="opponent")
        raw_opponent_name = opponent_elem.get_text(strip=True)
        cleaned_name = " ".join([part for part in raw_opponent_name.split() if not part.startswith("'")])
        
        # 模糊匹配对手名称(不区分大小写)
        if target_opponent.lower() in cleaned_name.lower():
            # 提取当前选手的收盘赔率
            odds_elem = entry.find("td", class_="fighter-odds close")
            if odds_elem:
                odds_value = int(odds_elem.get_text(strip=True))
                matched_odds.append(odds_value)
    
    return matched_odds

# 调用示例
jon_jones_url = "https://www.bestfightodds.com/fighters/Jon-Jones-819"
target = "Daniel Cormier"
print(fetch_odds_against_opponent(jon_jones_url, target))  # 输出 [-310, -192]

关键注意事项

  • DOM容器绑定:必须确保对手和赔率属于同一个比赛条目容器,这是避免对应关系错误的核心
  • 页面结构适配:如果网站更新了页面样式/类名,需要重新检查HTML结构,调整find/find_all的选择器参数(比如比赛容器的类名、对手/赔率元素的标签/类)
  • 名称匹配容错:对手名称可能附带昵称、头衔,需要做清洗或模糊匹配,避免因格式差异漏匹配
  • 赔率归属确认:要确保提取的赔率是当前选手的(而非对手的),比如页面中fighter-odds类通常对应当前页面选手的赔率,对手赔率会用另一个类区分

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 19:27:17