如何用BeautifulSoup在bestfightodds.com匹配对手与对应收盘赔率?
解决方案
核心思路是将单场比赛的对手信息与赔率绑定到同一个DOM容器中,不要单独遍历所有对手文本和所有赔率——这种方式必然会出现对应关系错乱的问题。以下是基于Python + BeautifulSoup的实现方案:
步骤说明
- 定位页面中每一场独立比赛的容器(比如表格行、独立div),确保对手名称和对应赔率都在这个容器内
- 遍历每个比赛容器,提取对手名称并与目标对手匹配(处理可能的昵称/别名)
- 在匹配成功的容器内,直接提取当前选手的收盘赔率
- 收集所有匹配到的赔率,返回结果列表
代码示例
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
相关产品推荐
相关产品推荐

