使用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
相关产品推荐
相关产品推荐

