Selenium获取Ogame排行榜表格所有行报错问题求助
解决Selenium无法获取Ogame高分页面表格内容的问题
我来帮你排查下问题并给出针对性的解决方案,你的代码目前存在几个关键问题导致无法正常获取表格内容:
问题原因分析
- 定位目标错误:你用
find_elements_by_xpath("//*[@id='ranks']/tbody")获取的是整个tbody元素,而非表格的每一行。即使能拿到元素,text属性只会返回tbody下所有文本的拼接,不是你想要的逐行数据,甚至可能因为文本都嵌套在tr/td里,导致直接取tbody的text返回空值。 - 旧API弃用:
find_elements_by_xpath是Selenium 4.x之前的旧方法,新版本已标记为弃用,继续使用可能引发兼容性问题。 - 等待机制不严谨:固定的
time.sleep(30)虽然给了你手动操作的时间,但如果手动完成操作后表格元素还没完全渲染,或者页面有动态加载,直接获取元素很可能会失败。
解决办法
1. 切换到新版元素定位API
先导入By类,用官方推荐的新定位方式替代旧方法:
from selenium.webdriver.common.by import By
2. 精准定位表格每一行
目标是获取所有表格行,所以应该定位到tbody下的所有tr元素,XPath调整为//*[@id='ranks']/tbody/tr。
3. 用显式等待替代固定sleep
使用WebDriverWait等待表格行加载完成,能更精准地控制等待时机,避免过早获取未渲染的元素:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC
4. 逐行提取数据
循环每个tr元素,可选择直接获取整行文本,或遍历每行的td元素提取具体列的精细数据。
修改后的完整代码示例
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 import time url = "https://lobby.ogame.gameforge.com/" driver_path = "chromedriver.exe" browser = webdriver.Chrome(driver_path) browser.get(url) # 给你手动完成登录和打开高分页面的时间 time.sleep(30) # 等待表格行加载完成,最多等待10秒 try: # 定位所有表格行 rows = WebDriverWait(browser, 10).until( EC.presence_of_all_elements_located((By.XPATH, "//*[@id='ranks']/tbody/tr")) ) table_data = [] for row in rows: # 方式1:获取整行文本 table_data.append(row.text) # 方式2:提取每行的每个单元格文本(如需精细数据,打开注释即可) # cells = row.find_elements(By.TAG_NAME, "td") # row_data = [cell.text for cell in cells] # table_data.append(row_data) print("表格数据:") for item in table_data: print(item) except Exception as e: print(f"获取表格数据失败:{str(e)}") finally: # 操作完成后关闭浏览器 browser.quit()
额外注意事项
- 如果表格是滚动加载(需要滚动页面才能显示更多行),你需要添加滚动逻辑,比如用
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")滚动到底部,多次执行直到没有新行加载。 - 确保你的ChromeDriver版本与本地Chrome浏览器版本完全匹配,版本不匹配会引发各种奇怪的兼容性错误。
内容的提问来源于stack exchange,提问作者W3gor
相关产品推荐
相关产品推荐

