Scrapy TypeError: списочные индексы должны быть целыми или кусочками, а не - PullRequest
0 голосов
/ 12 февраля 2020

Я хочу сделать приращение на каждой итерации для l oop, но я получаю TypeError

version ['version_code'] [i] = version_code
TypeError: индексы списка должны быть целыми или кусочками, а не 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

Ответы [ 3 ]

1 голос
/ 12 февраля 2020

3-я строка вашего кода переназначает версию как список, а не объект VersionsItem () больше после второй строки. Поскольку теперь это список, вы больше не можете получить к нему доступ со строками, как в этой части

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

(что, как я полагаю, вы можете сделать с объектом VersionsItem (), но вы не предоставили этот код для нам анализировать).

Другая проблема, которую я заметил, заключается в том, что вы используете индекс в качестве счетчика для вашего l oop. Это не pythoni c, и вместо этого вы должны использовать перечисление вместо того, чтобы получить доступ к списку.

И последнее: если вы просто пытаетесь расширить список для хранения большего количества данных, тогда вы не Т даже нужен индекс. Вы можете просто добавить данные в конец списка, и он автоматически добавит новый элемент. Поскольку вам не нужен индекс, вам также не нужно перечислять для l oop, как я говорил ранее. Вот что реализовано

С учетом сказанного, способ заставить ваш код работать так: создать словарь как таковой:

        #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
0 голосов
/ 12 февраля 2020

Да, я нашел решение вроде:

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
0 голосов
/ 12 февраля 2020

Эта проблема вызвана не i, а индексом version_code. я - int, и ошибка относится к тому факту, что он получил строку, а не int, что указывает на то, что запросить элемент у меня все в порядке, но запрос элемента 'code version' бесполезен.

Надеюсь Я не знаю много о scrapy, но я бы дважды проверил, как выглядит версия переменной, поставив печать (версию) перед рассматриваемой строкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...