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

Я новичок в Python, пытаясь построить веб-скребок с помощью Scrapy, и я получаю много непечатных и пробелов в результатах. Я пытаюсь перебрать словарь с помощью для l oop, где значения являются списками, а затем запустить метод .strip (), чтобы избавиться от всех непечатаемых символов. Только теперь я вижу эту ошибку: «TypeError: индексы списка должны быть целыми или кусочками, а не str». Я знаю, что, должно быть, неправильно понял объект, но после нескольких дней просмотра документов и подобных исключений я не нашел способа его разрешить.

Код, который я использую:

# -*- coding: utf-8 -*-
import scrapy
from ..items import JobcollectorItem
from ..AutoCrawler import searchIndeed


class IndeedSpider(scrapy.Spider):
    name = 'indeed'
    page_number = 2
    start_urls = [searchIndeed.current_page_url]

    def parse(self, response):
        items = JobcollectorItem()

        position = response.css('.jobtitle::text').extract()
        company = response.css('span.company::text').extract()
        location = response.css('.location::text').extract()

        # print(position[0])

        items['position'] = position
        items['company'] = company
        items['location'] = location

        for key in items.keys():
            prestripped = items[key]
            for object in prestripped:
                object = object.strip('\n')
            items[key] = prestripped

        yield items

Я использую python 3.7.4. Также приветствуются любые советы по упрощению функции избавления от вложенных циклов for. Код для всего проекта можно найти здесь .

Спасибо за помощь!

Edit0: исключение выдается в строке 27, читающей: "prestripped = items [ key] [value] TypeError: индексы списка должны быть целыми или кусочками, а не str "

Edit1: структура данных это items {'key': [list_of_strings]}, где имя словаря - элементы, ключи - это строка и значение ключа - это список, причем каждый элемент списка является строкой.

Edit2: обновлен код для отражения ответа Alex.Kh. Кроме того, вот примерное значение того, что в настоящее время возвращается: {company: ['\ nCompany Name', '\ n', '\ nCompany Name', '\ n', '\ n', '\ n',] , местоположение: ['Some City, US', 'Some City, US'], позиция: ['', '\ n', '\ nИмя должности', '', 'Имя позиции']}

1 Ответ

0 голосов
/ 31 марта 2020

В дополнение к моему комментарию, я думаю, что я знаю, как упростить и исправить ваш код.

...
for key in items.keys():
   restripped = items[key]
   #BEWARE: a novice mistake here as object is just a copy
   for object in restripped: #assuming extract() returns a list
         object=object.strip() # will change a temporary copy
   items[key] = restripped
...

Я не уверен, почему именно вам нужно значение в вашем l oop, поэтому Вы также можете просто сказать for key in items.keys():. Ваша основная ошибка, вероятно, заключалась в неправильном доступе к словарю (items[key][value]->items[key], поскольку value - фактически значение, соответствующее этому ключу).

Редактировать : я заметил огромную ошибку со своей стороны в for l oop. Поскольку он создает копию, оператор object=object.strip() не повлияет на фактический список. Угадай, что не пользуясь Python какое-то время, ты забудешь некоторые функции

Я оставлю неправильное решение напоминанием и мне, и другим. Правильный способ использования метода strip() заключается в следующем:

...
#correct solution
for key in items.keys():
   restripped = items[key]
   for i,object in enumerate(restripped):
         # alternatively: restripped[i]=restripped[i].strip()
         restripped[i]=object.strip()
   items[key] = restripped
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...