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
相关产品推荐
相关产品推荐

