You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Selenium循环按类名定位元素失败,求网页爬取解决方案

解决Flashscore赛事得分爬取问题

问题根源分析

你之前的代码报错主要有三个原因:

  1. 多类名定位错误:By.CLASS_NAME只能识别单个类名,无法处理空格分隔的多类名(比如目标类smh__part smh__home smh__part--1),Selenium会把整个字符串当作一个类名查找,自然找不到元素。
  2. 硬循环存在风险:预先设定循环次数N,如果实际赛事局数少于N,就会触发NoSuchElementException。
  3. 未等待元素加载:页面未完全渲染就执行查找,元素还未生成导致定位失败。

可行爬取方案

直接通过区分主场/客场的类名批量获取元素,配合显式等待确保元素加载完成,代码示例如下:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 02:46:24