【问题标题】:Scrapy TypeError: list indices must be integers or slices, not strScrapy TypeError:列表索引必须是整数或切片,而不是str
【发布时间】:2020-05-27 09:48:27
【问题描述】:

我想在 for 循环的每次迭代中进行增量,但我得到 TypeError

version['version_code'][i] = version_code
TypeError: list 索引必须是整数或切片,而不是 str

index = 0
version = VersionsItem()
version = []
for rRow in releaseRows:

    #rRow is a string

    releasehref = rRow.xpath(".//a/@href").get()
    if releasehref:
        exp = releasehref.replace("/apk/","")
        exp = exp.split("/")
        Vslug = exp[2]
        app_slug = exp[1]
        # #l-speed-root-v2-0-9
        expr = exp[2].replace("-release","")
        expr = expr.split(app_slug+"-",1)[1]
        version_code = expr.replace("-","")
        version_param = expr.replace("-",".")

        version['version_code'][index] = version_code
        version['version_param'][index] = version_param
        version['Vslug'][index] = Vslug
        index += 1

【问题讨论】:

    标签: python syntax scrapy


    【解决方案1】:

    是的,我找到了类似的解决方案:

    version = {} #NEW CODE
    
            releaseRows = response.xpath("//div[@id='primary']/div[@class='listWidget']/div[@class='appRow']/div/div[2]/div/h5")
            if releaseRows:
                 #NEW CODE
                for index, rRow in enumerate(releaseRows,1):
                    releasehref = rRow.xpath(".//a/@href").get()
                    if releasehref:
                        exp = releasehref.replace("/apk/","")
                        exp = exp.split("/")
                        Vslug = exp[2]
                        app_slug = exp[1]
                        # #l-speed-root-v2-0-9
                        expr = exp[2].replace("-release","")
                        expr = expr.split(app_slug+"-",1)[1]
                        version_code = expr.replace("-","")
                        version_param = expr.replace("-",".")
                        version[index] = {} #NEW CODE
                        version[index]['version_code'] = version_code #NEW CODE
                        version[index]['version_param'] = version_param #NEW CODE
                        version[index]['Vslug'] = Vslug #NEW CODE
    

    【讨论】:

      【解决方案2】:

      代码的第三行将版本重新分配为列表,而不是第二行之后的 VersionsItem() 对象。由于它现在是一个列表,因此您不能再像在本部分中那样使用字符串访问它

          version['version_code'][index] = version_code
          version['version_param'][index] = version_param
          version['Vslug'][index] = Vslug
          index += 1
      

      (我假设您可以使用 VersionsItem() 对象,但您没有提供该代码供我们分析)。

      我注意到的另一个问题是您使用索引 at 作为循环的计数器。这是非pythonic,您应该改为使用 enumerate 来访问列表。

      最后一件事,如果您只是想扩展列表以存储更多数据,那么您甚至不需要索引。您可以简单地将数据附加到列表的末尾,它会自动添加一个新元素。由于您不需要索引,因此您也不需要像我之前所说的那样枚举 for 循环。这是实现的

      话虽如此,让你的代码工作的一种方法是实例化一个字典:

              #version = VersionsItem() # Old Code
              #version = [] # Old Code
              version = {} # New Code
      
              # Instantiate all of these elements of the dictionary as being lists
              version['version_code'] = [] # New Code
              version['version_param'] = [] # New Code
              version['Vslug'] = [] # New Code
      
              for rRow in releaseRows:
              # Enumerated for loop if needed
              #for index, rRow in enumerate(releaseRows):
      
                  #rRow is a string
      
                  releasehref = rRow.xpath(".//a/@href").get()
                  if releasehref:
                      exp = releasehref.replace("/apk/","")
                      exp = exp.split("/")
                      Vslug = exp[2]
                      app_slug = exp[1]
                      # #l-speed-root-v2-0-9
                      expr = exp[2].replace("-release","")
                      expr = expr.split(app_slug+"-",1)[1]
                      version_code = expr.replace("-","")
                      version_param = expr.replace("-",".")
      
                      version['version_code'].append(version_code) # New Code
                      version['version_param'][index].append(version_param) # New Code
                      version['Vslug'][index].append(Vslug) # New Code
      

      【讨论】:

        【解决方案3】:

        这个问题似乎不是由 i 引起的,而是由“version_code”索引引起的。 i 是一个 int 并且错误与它得到一个字符串而不是一个 int 的事实有关,表明要求项目 i 是可以的,但要求项目 '版本代码' 是不好的。

        我对scrapy了解不多,但我会通过在相关行之前放置一个 print(version) 来仔细检查变量版本的外观。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-12-09
          • 2021-11-28
          • 1970-01-01
          • 1970-01-01
          • 2020-05-14
          相关资源
          最近更新 更多