使用BeautifulSoup爬虫时如何处理赔率缺失值问题
解决赔率缺失导致的数组长度不匹配问题
核心思路是按单个赛事维度处理赔率,逐个检查每种赔率类型对应的标签内容,遇到空文本就填充0或空值,确保每个赛事的赔率字段数量固定,不会因为部分标签无内容打乱关联关系。
替代原有批量获取逻辑
如果你之前是批量抓取所有tipoQuotazione_1标签的文本再拆分,这种方式在有缺失时必然会出错。改成针对每个赛事的独立容器处理:
# 先定位所有赛事的父容器(根据页面实际class调整,比如假设是'event-item') event_containers = soup.find_all('div', class_='event-item') for event in event_containers: # 提取赛事基本信息,比如对阵双方 teams = event.find('div', class_='teams').get_text(strip=True) # 处理当前赛事的所有赔率 odds_data = {} # 1X赔率(优先用属性定位,比nth-of-type更可靠) x1_odds_tag = event.select_one('p.tipoQuotazione_1[data-type="1x"]') odds_data['1X'] = x1_odds_tag.get_text(strip=True) if (x1_odds_tag and x1_odds_tag.get_text(strip=True)) else '0' # 12赔率 x12_odds_tag = event.select_one('p.tipoQuotazione_1[data-type="12"]') odds_data['12'] = x12_odds_tag.get_text(strip=True) if (x12_odds_tag and x12_odds_tag.get_text(strip=True)) else '0' # X2赔率 x2_odds_tag = event.select_one('p.tipoQuotazione_1[data-type="x2"]') odds_data['X2'] = x2_odds_tag.get_text(strip=True) if (x2_odds_tag and x2_odds_tag.get_text(strip=True)) else '0' # 大小球赔率 overunder_odds_tag = event.select_one('p.tipoQuotazione_1[data-type="overunder"]') odds_data['大小球'] = overunder_odds_tag.get_text(strip=True) if (overunder_odds_tag and overunder_odds_tag.get_text(strip=True)) else '0' # 把赛事信息和赔率存起来,比如追加到列表 print(f"{teams}: {odds_data}")
关键细节说明
- 优先用属性定位:如果标签有
data-type这类专属属性,别依赖nth-of-type,页面结构变动时后者更容易出错。 - 双重判断:先检查标签是否存在,再检查文本是否非空(避免标签存在但全是空白字符的情况)。
- 固定字段数量:不管某类赔率有没有值,每个赛事的
odds_data都会包含所有预设字段,后续关联赛事和赔率时就不会出现长度不匹配的问题。
适配Selenium动态加载
如果页面是动态加载的,记得在解析前等待目标元素加载完成:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 等待所有赛事容器加载完成 WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located((By.CLASS_NAME, 'event-item')) ) # 再获取页面源码转成soup soup = BeautifulSoup(driver.page_source, 'html.parser')
内容的提问来源于stack exchange,提问作者eestlane
相关产品推荐
相关产品推荐

