Selenium从单列提取多文本:批量获取200款游戏Genre方法问询
解决Selenium定位游戏Genre的问题(含翻页获取前4页数据)
一、修复第一页Genre提取的问题
你用的绝对XPATH太脆弱,页面结构稍有变动就会定位错误,而且没处理动态加载的情况,导致提取内容和实际不符。改成相对定位更可靠,同时确保所有元素加载完成:
优化后的第一页代码
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 PATH = "C:/Users/user/D/chromedriver.exe" driver = webdriver.Chrome(PATH) driver.get("https://playtoearn.net/blockchaingames/Ethereum/All-Genre/All-Status/All-Device/All-NFT/All-PlayToEarn/All-FreeToPlay") # 等待表格加载,滚动到底部确保所有50款游戏渲染完成 WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//table[contains(@class, 'table') and .//th[text()='Genre']]"))) driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(2) # 定位目标表格(通过表头的Genre文本锁定,避免外层结构变动影响) game_table = driver.find_element(By.XPATH, "//table[contains(@class, 'table') and .//th[text()='Genre']]") # 获取所有数据行(排除表头行) game_rows = game_table.find_elements(By.XPATH, "./tbody/tr[position()>1]") # 遍历提取每一行的Genre for row in game_rows: genre_td = row.find_element(By.XPATH, "./td[4]") print(genre_td.text.strip())
关键改进点
- 用相对XPATH定位表格:通过表头文本锁定目标表格,不会因为页面外层div变化失效
- 滚动页面加载全部游戏:部分游戏在页面下方,不滚动的话Selenium获取不到未渲染的元素
- 避免硬编码行号:直接遍历表格数据行,防止行索引和实际页面结构不符
二、扩展到前4页共200款游戏
要获取前4页数据,需要处理分页逻辑:找到「下一页」按钮,点击后重复提取流程,直到第4页:
完整翻页代码
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 PATH = "C:/Users/user/D/chromedriver.exe" driver = webdriver.Chrome(PATH) driver.get("https://playtoearn.net/blockchaingames/Ethereum/All-Genre/All-Status/All-Device/All-NFT/All-PlayToEarn/All-FreeToPlay") all_genres = [] # 遍历前4页 for page in range(4): # 等待表格加载+滚动加载当前页所有游戏 WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//table[contains(@class, 'table') and .//th[text()='Genre']]"))) driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(2) # 提取当前页Genre game_table = driver.find_element(By.XPATH, "//table[contains(@class, 'table') and .//th[text()='Genre']]") game_rows = game_table.find_elements(By.XPATH, "./tbody/tr[position()>1]") for row in game_rows: genre_td = row.find_element(By.XPATH, "./td[4]") genre_text = genre_td.text.strip() all_genres.append(genre_text) print(genre_text) # 非最后一页则点击下一页 if page < 3: # 等待下一页按钮可点击,滚动到按钮位置避免遮挡 next_btn = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//a[contains(text(), 'Next')]"))) driver.execute_script("arguments[0].scrollIntoView();", next_btn) time.sleep(1) next_btn.click() time.sleep(3) # 等待页面跳转加载 # 可选:将结果保存到文件 with open("game_genres.txt", "w", encoding="utf-8") as f: for genre in all_genres: f.write(genre + "\n") driver.quit()
翻页注意事项
- 用
WebDriverWait确保下一页按钮可点击,避免因页面未加载完成导致点击失败 - 每次翻页后留足够加载时间,防止页面未渲染就开始提取
- 滚动到按钮位置,避免被页面底部固定元素遮挡
三、常见问题排查
- 若仍出现内容不符:检查是否有广告行混入数据行,可通过行的class属性过滤(比如找带特定类的tr)
- 驱动兼容性:确保ChromeDriver和你的Chrome浏览器版本一致,否则会出现异常
内容的提问来源于stack exchange,提问作者Steven.H
相关产品推荐
相关产品推荐

