Python根据背景色爬取足球赛事获胜赔率及赛事名去重问题求助
解决足球赛事获胜赔率爬取的重复输出与元素定位问题
首先,我们来拆解你遇到的两个核心问题:灰色背景赔率定位失败和赛事重复输出,然后一步步给出修正方案。
问题1:为什么用背景色定位元素返回空列表?
你之前的代码错误地将res_c当作了标签名,而实际上它是元素的class属性。正确的写法应该是指定标签为span,并匹配对应的class和style:
# 错误写法 soup.find_all('res_c', {"style":"background-color:#636364"}) # 正确写法:指定span标签,匹配class包含res_c且style符合条件的元素 soup.find_all('span', class_=lambda c: c and 'res_c' in c, style=lambda s: s and 'background-color:#636364' in s)
另外要注意:如果页面的灰色背景是通过CSS类而非内联style设置的,你可能需要检查元素的完整class列表,比如是否有专门标识获胜结果的类名,再调整匹配逻辑。
问题2:如何避免赛事重复输出?
你当前代码的重复输出是因为逻辑混乱:每次循环都创建新的match列表,且没有有效去重逻辑。最简洁的解决方式是用字典存储赛事与赔率——字典的键是唯一的,天然避免重复。
修正后的完整代码
import requests from bs4 import BeautifulSoup url = 'https://www.pronosoft.com/fr/parions_sport/resultats-parions-sport-plein-ecran.htm?date=07-02-2020' r = requests.get(url) soup = BeautifulSoup(r.text, 'html.parser') # 用字典存储赛事名称(键)和对应的获胜赔率(值),自动去重 match_odds = {} # 筛选所有包含足球赛事标识的行 for row in soup.select('tr:has(span.sport.football)'): # 提取干净的赛事名称 match_name_tag = row.find('a', class_='infos') if not match_name_tag: continue # 跳过没有赛事名称的行 match_name = match_name_tag.get_text(strip=True) # 如果赛事已经记录过,直接跳过 if match_name in match_odds: continue # 找到灰色背景的获胜赔率 winning_odd_tag = row.find( 'span', class_=lambda c: c and 'res_c' in c, style=lambda s: s and 'background-color:#636364' in s ) if winning_odd_tag: winning_odd = winning_odd_tag.get_text(strip=True) match_odds[match_name] = winning_odd # 输出最终结果:每个赛事仅显示一次 for match, odd in match_odds.items(): print(f"{odd} {match}")
代码关键说明
- 精准筛选足球赛事行:用
soup.select('tr:has(span.sport.football)')直接定位所有包含足球标识的行,避免处理其他运动赛事。 - 自动去重:通过字典
match_odds的键唯一性,确保每个赛事只被记录一次。 - 干净的文本提取:用
get_text(strip=True)去除赛事名称和赔率中的多余换行、空格,让结果更整洁。 - 可靠的赔率定位:结合class和style双重匹配,确保找到的是灰色背景的获胜赔率。
内容的提问来源于stack exchange,提问作者Exramas
相关产品推荐
相关产品推荐

