使用Selenium抓取Steam游戏时长生成pandas表时所有元素重复如何修复
问题原因
- 核心错误出在XPath的查询范围上:你在循环内使用的
//开头的XPath是从整个HTML文档的根节点开始匹配元素,每次都会返回整个页面第一个符合条件的游戏标题和时长,所以317行结果全都是第一个游戏《巫师3》的数据。 - XPath里的
//代表全局搜索,不会限定在你当前遍历的game元素范围内。
修复方案
把循环内的XPath开头改成.//,.代表从当前节点(也就是你遍历到的单个game元素)的子节点开始搜索,就能准确拿到每个游戏对应的数据。
另外可以加隐式等待避免页面没加载完成就抓取元素的问题,修改后的完整代码如下:
from selenium import webdriver import pandas as pd url = 'https://steamcommunity.com/id/username/games/?tab=all' driver = webdriver.Chrome(executable_path="path/chromedriver.exe") # 加隐式等待,最多等10秒加载元素 driver.implicitly_wait(10) driver.get(url) game_hour_infos = [] games = driver.find_elements_by_class_name('gameListRow') for game in games: # 把//改成.// 限定在当前game元素内搜索 title = game.find_element_by_xpath( './/*[starts-with(@id,"game_")]/div[2]/div[1]/div[1]/div').text hour = game.find_element_by_xpath( './/*[starts-with(@id,"game_")]/div[2]/div[1]/div[1]/h5').text ghi = { "title": title, "hour": hour } game_hour_infos.append(ghi) print(pd.DataFrame(game_hour_infos)) driver.close()
内容的提问来源于stack exchange,提问作者wdafoe666
相关产品推荐
相关产品推荐

