Python Selenium列表推导式遍历WebElement列表返回重复首条数据问题
问题根因与修复方案
核心错误原因
pull_all_stonks函数中使用的XPath是全局绝对路径,是导致所有结果重复的直接原因:
Selenium的XPath查询规则中,以//开头的路径会从整个HTML文档的根节点开始搜索匹配元素,和你调用find_element的父WebElement完全无关。所以你每次遍历不同的stonk元素调用查询时,返回的永远是整个页面第一个符合//tr/td[2]/a规则的元素,最终所有结果都是第一条数据的重复。
如果要基于当前传入的stonk元素做相对范围查询,必须在XPath开头加.,代表查询范围限定在当前节点的子节点下。
修复代码
修改pull_all_stonks函数的XPath为相对路径即可,因为传入的stonk本身就是tr下的第二个td元素,直接查询其子节点的a标签就可以,写法还可以简化:
def pull_all_stonks(stonk): # 开头加. 代表仅在当前stonk元素的子节点中搜索 stonks_table_name_and_link = stonk.find_element(By.XPATH, './a') stonk_name = stonks_table_name_and_link.text stonk_link = stonks_table_name_and_link.get_attribute('href') return { 'stonk_name': stonk_name, 'stonk_link': stonk_link }
其他可选优化
get_all_stonks函数中定义的stonks_table_selector、stonks_table等多个变量没有实际使用,可以直接删除- 全局定义的
action变量建议放到函数内部初始化,避免作用域混乱引发的意外操作
内容的提问来源于stack exchange,提问作者Wanderduck
相关产品推荐
相关产品推荐

