Selenium循环按类名定位元素失败,求网页爬取解决方案
解决Flashscore赛事得分爬取问题
问题根源分析
你之前的代码报错主要有三个原因:
- 多类名定位错误:
By.CLASS_NAME只能识别单个类名,无法处理空格分隔的多类名(比如目标类smh__part smh__home smh__part--1),Selenium会把整个字符串当作一个类名查找,自然找不到元素。 - 硬循环存在风险:预先设定循环次数
N,如果实际赛事局数少于N,就会触发NoSuchElementException。 - 未等待元素加载:页面未完全渲染就执行查找,元素还未生成导致定位失败。
可行爬取方案
直接通过区分主场/客场的类名批量获取元素,配合显式等待确保元素加载完成,代码示例如下:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 初始化浏览器并打开目标页面 driver = webdriver.Chrome() driver.get("https://www.flashscore.it/partita/YgxSmkBr/#/informazioni-partita/informazioni-partita") # 显式等待元素加载(最多等待10秒) wait = WebDriverWait(driver, 10) # 获取所有主场得分元素 home_score_elements = wait.until( EC.presence_of_all_elements_located((By.CSS_SELECTOR, "div.smh__part.smh__home")) ) # 获取所有客场得分元素 away_score_elements = wait.until( EC.presence_of_all_elements_located((By.CSS_SELECTOR, "div.smh__part.smh__away")) ) # 配对每一局的双方得分 match_scores = [] for home_elem, away_elem in zip(home_score_elements, away_score_elements): match_scores.append({ "主场得分": home_elem.text.strip(), "客场得分": away_elem.text.strip() }) # 输出结果 for idx, score in enumerate(match_scores, 1): print(f"第{idx}局: 主场{score['主场得分']} - 客场{score['客场得分']}") driver.quit()
关键说明
- CSS选择器定位多类名:
div.smh__part.smh__home表示同时拥有smh__part和smh__home类的div元素,完美适配目标元素的多类名结构。 - 批量获取元素:
presence_of_all_elements_located会返回所有匹配的元素,无需预先知道局数,避免硬循环的风险。 - 显式等待:确保页面元素渲染完成后再执行查找,比
time.sleep更高效可靠。
内容的提问来源于stack exchange,提问作者Gabrielek
相关产品推荐
相关产品推荐

