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

Selenium遍历不同行却得到相同结果,问题原因是什么?

问题:Selenium遍历表格行时子元素获取结果始终相同

遍历table通过XPath获取的row元素,每次打印的row对象都不同,但获取row下的gridcell相关子元素时,结果始终相同。相关代码及输出如下:

代码

rows = table.find_elements(By.XPATH, "//div[@role='row']")
for row in rows:
    print(row)
    print(row.find_element(By.XPATH, '//*[@role="gridcell"][1]'))
    print(row.find_element(By.XPATH, '//*[@role="gridcell"][1]/span'))
    print(row.find_element(By.XPATH, '//*[@role="gridcell"][1]/span/a[1]'))
    name = row.find_element(By.XPATH, '//div[@role="gridcell"][1]/span/a[1]')

输出

<selenium.webdriver.remote.webelement.WebElement (session="0f06562267ccaa7755c3e9a20542161e", element="8828F8096DD88B9082D0630AAD96DF91_element_74")>
<selenium.webdriver.remote.webelement.WebElement (session="0f06562267ccaa7755c3e9a20542161e", element="8828F8096DD88B9082D0630AAD96DF91_element_96")>
<selenium.webdriver.remote.webelement.WebElement (session="0f06562267ccaa7755c3e9a20542161e", element="8828F8096DD88B9082D0630AAD96DF91_element_97")>
<selenium.webdriver.remote.webelement.WebElement (session="0f06562267ccaa7755c3e9a20542161e", element="8828F8096DD88B9082D0630AAD96DF91_element_98")>

<selenium.webdriver.remote.webelement.WebElement (session="0f06562267ccaa7755c3e9a20542161e", element="8828F8096DD88B9082D0630AAD96DF91_element_75")>
<selenium.webdriver.remote.webelement.WebElement (session="0f06562267ccaa7755c3e9a20542161e", element="8828F8096DD88B9082D0630AAD96DF91_element_96")>
<selenium.webdriver.remote.webelement.WebElement (session="0f06562267ccaa7755c3e9a20542161e", element="8828F8096DD88B9082D0630AAD96DF91_element_97")>
<selenium.webdriver.remote.webelement.WebElement (session="0f06562267ccaa7755c3e9a20542161e", element="8828F8096DD88B9082D0630AAD96DF91_element_98")>

问题原因及解决办法

问题出在XPath表达式的写法上:当你在row.find_element()中使用//开头的XPath时,Selenium会从整个HTML文档的根节点开始查找元素,而不是从当前的row元素下查找。所以每次获取的都是文档中第一个匹配条件的元素,自然结果始终相同。

解决方法很简单,把XPath开头的//改成.//,这样就表示从当前元素(即row)的子节点开始相对查找。

修改后的代码如下:

rows = table.find_elements(By.XPATH, "//div[@role='row']")
for row in rows:
    print(row)
    print(row.find_element(By.XPATH, './/*[@role="gridcell"][1]'))
    print(row.find_element(By.XPATH, './/*[@role="gridcell"][1]/span'))
    print(row.find_element(By.XPATH, './/*[@role="gridcell"][1]/span/a[1]'))
    name = row.find_element(By.XPATH, './/div[@role="gridcell"][1]/span/a[1]')

内容的提问来源于stack exchange,提问作者omerS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 01:40:06