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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 04:39:20