Python使用BeautifulSoup+Selenium爬取Oddsportal时league字段重复问题
问题根因
你当前的错误核心是直接从页面头部取固定位置的联赛值count[1].text给所有行复用,没有跟着表格内的联赛头行更新联赛变量。Oddsportal的赛事表结构是:先出现一行「国家 » 联赛」的头行,下面跟着该联赛的所有赛事,你的代码里只在头行更新了国家值,没有同步更新联赛值。
修改方案
- 在
parse_data函数里新增current_league变量存储当前遍历到的联赛 - 遇到联赛头行(即
:不在row[1]的行)时,拆分出头行的国家和联赛,分别赋值给对应的变量 - 遍历赛事行时,把当前
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
相关产品推荐
相关产品推荐

