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

Selenium遍历表格遇TypeError:列表索引需为整数而非字符串

解决"list indices must be integers or slices not str"错误

嘿,这个错误的原因很明确——你在第二个for循环里犯了个小逻辑错误:j是crsList里的元素值(也就是表格单元格的文本字符串),但你却把它当成列表索引来用crsList[j],列表索引只能是整数,所以就报这个错啦。

咱们先拆解下你代码里的问题:

  1. 第二个循环嵌套在第一个循环里,意味着每往列表里加一个元素,就会遍历整个列表一次,这不仅低效,逻辑上也没必要;
  2. 你试图用字符串类型的元素值去索引列表,这完全不符合列表的索引规则;
  3. 就算匹配到了,你双击的是字符串chsnclass,而不是对应的WebElement,这根本不会生效。

给你修正后的代码,我还加了一些鲁棒性优化:

def choose_class(self):
    # 获取所有表格单元格的WebElement(如果CRN在固定列,建议把XPath改成对应列,比如td[3])
    crs_elements = driver.find_elements(By.XPATH, "//*[@id='table1']/tbody/tr/td")
    crs_list = []
    
    # 先批量收集所有单元格文本
    for elem in crs_elements:
        crs_list.append(elem.text)
    print(crs_list)

    # 用enumerate同时获取索引和元素值,避免索引错误
    for idx, text in enumerate(crs_list):
        # 先判断文本是否是数字,防止转换整数报错
        if text.strip().isdigit():
            if int(text) == crn:
                # 通过索引拿到对应的WebElement,这才是可以操作的对象
                target_elem = crs_elements[idx]
                # 执行双击+复制操作
                webdriver.ActionChains(driver).double_click(target_elem).key_down(Keys.META).send_keys('c').perform()
                # 找到匹配项后退出循环,避免重复操作
                break

几个关键的修正点:

  • 把遍历匹配的逻辑移到收集完所有元素之后,避免重复遍历;
  • 用enumerate同时拿到索引和元素值,既能判断值是否匹配,又能通过索引定位到对应的WebElement(毕竟要操作的是页面元素,不是字符串);
  • 增加了数字判断,防止遇到非数字文本时转换整数抛出新的错误;
  • 匹配到目标后用break退出循环,避免对多个可能的匹配项重复执行操作。

另外提个小建议:如果CRN在表格的固定列(比如第3列),建议把XPath改成"//*[@id='table1']/tbody/tr/td[3]",这样只会收集CRN列的文本,避免无关数据混进列表里,匹配起来更精准。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 18:10:30