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

使用Selenium爬取Supersport页面时部分同class元素无法获取的问题

解决Selenium无法获取全部相同class元素的问题

看起来你遇到的是典型的动态内容加载问题,我来帮你分析可能的原因和对应的解决思路:

1. 最可能的原因:懒加载(滚动/触发式加载)

很多体育赛事网站为了优化加载速度,会采用懒加载机制——也就是只有当页面滚动到特定位置,或者用户触发了某个操作(比如点击“展开更多”),才会渲染下方的内容。你看到元素的HTML结构相同,但实际上那些没被获取到的联赛元素,在你执行查找代码的时候还没被加载到DOM里,自然不会出现在结果列表中。

解决办法:模拟滚动加载所有内容

你可以通过执行JavaScript来滚动页面,触发内容加载,等所有元素都渲染完成后再进行查找:

import time

# 循环滚动直到页面不再加载新内容
last_scroll_height = driver.execute_script("return document.body.scrollHeight")
while True:
    # 滚动到当前页面底部
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    # 等待2秒让内容加载(可以根据实际情况调整等待时间)
    time.sleep(2)
    # 获取新的页面高度
    new_scroll_height = driver.execute_script("return document.body.scrollHeight")
    # 如果高度不再变化,说明没有更多内容可加载
    if new_scroll_height == last_scroll_height:
        break
    last_scroll_height = new_scroll_height

# 现在再获取所有联赛元素
football_leagues_elements = driver.find_elements_by_css_selector("div.sportska-liga.nogomet")

2. 检查是否存在隐藏的iframe

有些网站会把部分内容嵌入到iframe中,而Selenium默认是在主页面的上下文里操作,无法直接获取iframe内的元素。你可以检查页面源码,看看那些未被获取的联赛是否在某个iframe里。

解决办法:切换到iframe上下文查找

# 遍历页面中的所有iframe,尝试切换并查找元素
for iframe in driver.find_elements_by_tag_name("iframe"):
    driver.switch_to.frame(iframe)
    # 尝试获取目标元素
    temp_elements = driver.find_elements_by_css_selector("div.sportska-liga.nogomet")
    if temp_elements:
        football_leagues_elements = temp_elements
        break
# 切换回主页面上下文
driver.switch_to.default_content()

3. 用显式等待确保元素完全加载

有时候你执行查找操作的时机太早,部分元素还没完成渲染。使用Selenium的显式等待可以确保等待到所有目标元素都出现在DOM中:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 最长等待10秒,直到所有目标元素都存在
wait = WebDriverWait(driver, 10)
football_leagues_elements = wait.until(
    EC.presence_of_all_elements_located((By.CSS_SELECTOR, "div.sportska-liga.nogomet"))
)

注意:这个方法仅适用于元素已经被触发加载的情况,如果是懒加载导致的未渲染,还是需要先配合滚动操作。

4. 检查是否有“展开更多”按钮

你可以手动打开目标页面,滚动到SRL GRČKA 1.下方,看看是否有类似克罗地亚语“Prikaži više”(显示更多)的按钮。如果有,需要先点击该按钮触发内容加载:

try:
    # 定位展开按钮(根据实际文本调整xpath)
    show_more_btn = driver.find_element_by_xpath("//button[contains(text(), 'Prikaži više')]")
    # 滚动到按钮可见位置
    driver.execute_script("arguments[0].scrollIntoView();", show_more_btn)
    # 点击按钮
    show_more_btn.click()
    # 等待内容加载
    time.sleep(2)
except Exception as e:
    print(f"未找到展开按钮或点击失败:{e}")

验证步骤

你可以先手动操作页面:

  • 打开目标网页,滚动到SRL GRČKA 1.下方,观察页面是否会加载新内容
  • 检查是否有需要点击的展开按钮
  • 查看页面源码,确认未获取的元素是否在iframe内

通过这些步骤可以快速定位问题根源,再对应使用上面的解决方法。

内容的提问来源于stack exchange,提问作者Luka Kunej

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 16:07:42