Selenium Python爬取odds ng-star-inserted类div出现重复值如何解决
问题核心原因
- XPath全局搜索问题:代码中
//div[@class="game g2 ng-star-inserted"]以//开头,代表从整个HTML文档根节点搜索匹配元素,每次循环都会优先返回第一场赛事的对应节点,所以永远拿到1.30、2.30这组值。 - 节点索引匹配错误:你需要的目标赔率属于每个赛事下的第三个
game节点,原有循环的判断条件、节点搜索范围都不匹配。 - 循环拆分导致长度不匹配:单独拆分赛事和赔率的遍历循环,很容易出现两个数组长度不一致的问题,就是你遇到的
ValueError: All arrays must be of the same length报错。
修改后的代码
teams = [] btts = [] box = driver.find_element(By.XPATH, '//*[@id="page"]/div[2]') sport_title = box.find_element(By.CLASS_NAME, 'sport-name') parent = sport_title.find_element(By.XPATH, './..') grandparent = parent.find_element(By.XPATH, './../..') # 简化多层父节点查找 single_row_events = grandparent.find_elements(By.CLASS_NAME, 'event') for match in single_row_events: # 提取队伍名称 for team in match.find_elements(By.CLASS_NAME, 'rivals'): teams.append(team.text.strip()) # 直接提取当前赛事的目标赔率:用.开头的相对路径,仅搜索当前match节点内的元素 target_game = match.find_element(By.XPATH, './/div[@class="game g2 ng-star-inserted"]') odds = [o.text.strip() for o in target_game.find_elements(By.CLASS_NAME, 'odds')] btts.append('\n'.join(odds)) # 输出结果 for t, o in zip(teams, btts): print(f"{t} {o}", end=" ")
代码修改说明
- 把赔率提取逻辑整合到赛事遍历循环内,避免两个列表长度不匹配的问题
- 用
.开头的相对XPath路径,限定只在当前赛事节点内搜索元素,不会拿到其他赛事的数值 - 直接定位
class="game g2 ng-star-inserted"的目标节点,精准提取对应两个赔率值
运行后即可得到预期输出:Netherlands\nSouth Korea 1.30\n2.30 Germany\nJapan 1.31\n2.31
内容的提问来源于stack exchange,提问作者Daniel Richardson
相关产品推荐
相关产品推荐

