Selenium使用XPath获取ID信息时遭遇'TypeError'错误求助
解决Selenium获取ID时的TypeError问题
问题场景
需要从以下HTML结构中提取ID信息:
<div class="content"> <ul> <li class="info-holder"> <h3 style=""><a href="#" style="">Information</a></h3> <div class="tabela-lista-valor"> <p class="outer tabela-lista-item"> Id </p> <p class="inner" style="font-family: 'Open Sans', Arial, Helvetica, sans-serif !important;margin-bottom: 0px;padding: 8px 8px;">1</p> </div> </li> </ul> </div>
执行代码时触发错误:TypeError: 'WebElement' object is not subscriptable,原代码如下:
for z in range(2): id_test = navegador.find_element(By.XPATH,"(//p[contains(concat(' ', normalize-space(@class), ' '),' inner ')])[1]") for i in range(1,500): dados_temporarios = {'ID': id_test[i].text} dados.append(dados_temporarios) navegador.find_element(By.XPATH, "//a[contains(text(),'next')]").click()
错误原因
find_element()方法返回单个WebElement对象,而非列表,因此不能使用id_test[i]这种下标方式访问。- 内层循环
range(1,500)逻辑无效:既没有重新获取元素,也没有对应页面上的500个ID元素。 - 翻页后未重新定位元素,后续操作会引用过期元素,可能触发
StaleElementReferenceException。
修正后的代码
场景1:每个页面仅含1个ID元素
dados = [] for z in range(2): # 获取当前页面的ID文本 id_text = navegador.find_element(By.XPATH, "//p[contains(concat(' ', normalize-space(@class), ' '),' inner ')]").text dados.append({'ID': id_text}) # 点击下一页 navegador.find_element(By.XPATH, "//a[contains(text(),'next')]").click()
场景2:每个页面有多个ID元素(class为inner的p标签)
dados = [] for z in range(2): # 获取当前页面所有匹配的ID元素列表 id_elements = navegador.find_elements(By.XPATH, "//p[contains(concat(' ', normalize-space(@class), ' '),' inner ')]") # 遍历提取每个ID文本 for elem in id_elements: dados.append({'ID': elem.text}) # 点击下一页 navegador.find_element(By.XPATH, "//a[contains(text(),'next')]").click()
关键说明
- 使用
find_elements()(复数形式)获取页面上所有匹配元素,返回WebElement列表,支持遍历或下标访问。 - 翻页后必须重新调用元素定位方法,避免引用过期元素。
- 若目标元素的
class属性无多余空格,XPath可简化为//p[@class='inner'],原表达式的concat+normalize-space是为了兼容class属性带空格的场景,可按需保留。
内容的提问来源于stack exchange,提问作者Wagner Silva
相关产品推荐
相关产品推荐

