Форум программистов, компьютерный форум, киберфорум
Python: Web
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/103: Рейтинг темы: голосов - 103, средняя оценка - 4.77
14 / 8 / 7
Регистрация: 09.01.2018
Сообщений: 151

String indices must be integers

09.01.2018, 04:28. Показов 19777. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет,вообщем написал парсер , и долго боролся с картинкой(не мог подтянуть), только поборол эту проблему , как выскочила другая.
теперь не могу записать данные в ексель из-за string indices must be integers Вот весь код
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
url = 'https://www.lampa.kiev.ua/ua/katalog/searchANJA+X'
 
def get_html(url):
    html = requests.get(url)
    return html
 
 
def get_page_data(html):
    tf = ''
    lamp = tf
    socle = tf
    group = 'Люстри'
    country = 'Чехія'
    design = 'класичний'
    soup = BeautifulSoup(html.text)
    info = soup.find('div', class_='catalog_hr')#.find_all('b')[5].text
 
    tovname = soup.find('div', class_='catalog_tovname').find('a').text
    index = re.findall('(\d+)',tovname )
 
    for ad in info:
        
        try:
            heightm = ad.find('b')[2].text
        except:
            heightm = ''
        try:
            width = ad.find('b')[3].text
        except:
            width = ''
        try:
            in_lamp = ad.find('b')[4]
            lamp = in_lamp.split('x')[0]
            socle = in_lamp.split('x')[1]
        except:
            in_lamp = ''
        try:
            color_stl = ad.find('b')[7].text
        except:
            color_stl = ''
        try:
            type_stl = ad.find('b')[8].text
        except:
            type_stl = ''
        try:
            color_lamp = ad.find('b')[9].text
        except:
            color_lamp = ''
        try:
            type_lamp = ad.find('b')[10].text
        except:
            type_lamp = ''
        try:
            maker = ad.find('b')[12].text
        except:
            maker = ''
 
        data = {'index': index,
                    'name': tf,
                    'group': group,
                    'description': tf,
                    'maker': maker,
                    'country': country,
                    'design': design,
                    'lamp': lamp,
                    'socle': socle,
                    'color_lamp': color_lamp,
                    'type_lamp': type_lamp,
                    'color_stl': color_stl,
                    'type_stl': type_stl,
                    'heightm': heightm,
                    'width': width,
                    'depth':heightm}
    return data
 
 
def export_excel(filename , datas):
    workbook = xlsxwriter.Workbook(filename)
    worksheet = workbook.add_worksheet()
 
    field_names = ('код товару',
                     'назва серії, модель',
                      'група товару для сайту',
                      'опис',
                      'виробник',
                      'країна',
                      'дизайн',
                      'кількість патронів',
                      'цоколь',
                      'колір плафона',
                      'матеріал плафона',
                      'колір арматури',
                      'матеріал арматури',
                      'розмір (см) Ш',
                      'розмір (см) В',
                      'розмір (см) Г',
                      'фото')
 
    for i ,field in enumerate(field_names):
        worksheet.write(0, i, field)
 
    fields = ('index', 'name', 'group',
     'description', 'maker','country', 
     'design', 'lamp', 'socle', 'color_lamp',
     'type_lamp','color_stl','type_stl',
     'heightm','width','depth')
    for row, data in enumerate(datas, start=1):
        print(row)
        print(data)
        for col, field in enumerate(fields):
            print(col)
            print(field)
            worksheet.write(row, col, data[field])
 
    workbook.close()
 
def main():
    url = 'https://www.lampa.kiev.ua/ua/katalog/searchANJA+X'
    html = get_html(url)
    datas = get_page_data(html)
    print(datas)
    export_excel('data.xlsx', datas)
Именно на этой строке вылетает ошибка
Python
1
worksheet.write(row, col, data[field])
Подскажите что тут можно сделать , я читал про обходы строк , но толи не до конца понимаю толи мне тут это не подходит. Вообщем подскажите что мне с этим делать.

А ну и сами ошибки
Python
1
2
3
4
5
6
7
8
Traceback (most recent call last):
  File "C:/Users/игор/Desktop/4Wscript/test.py", line 135, in <module>
    main()
  File "C:/Users/игор/Desktop/4Wscript/test.py", line 132, in main
    export_excel('data.xlsx', datas)
  File "C:/Users/игор/Desktop/4Wscript/test.py", line 123, in export_excel
    worksheet.write(row, col, data[field])
TypeError: string indices must be integers
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.01.2018, 04:28
Ответы с готовыми решениями:

TypeError: string indices must be integers
Почему возникает ошибка: Traceback (most recent call last): File &quot;C:\Users\A1lpy\Desktop\PyMain\main.py&quot;, line 5, in...

TypeError: string indices must be integers
Привет, код не работает Выдает: TypeError: string indices must be integers Прошу помочь Писал программу анаграммы import random ...

TypeError: string indices must be integers
Добрый день, пишу функцию вычисления коэффициента Пирсона. И выбивает эту ошибку TypeError: string indices must be integers N=137 ...

20
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
09.01.2018, 04:48
У вас field --> строка, а должно быть целое число
0
14 / 8 / 7
Регистрация: 09.01.2018
Сообщений: 151
09.01.2018, 05:01  [ТС]
Благодаря этой теме Ошибка. Индикатор строки должен быть целым числом, не строкой
я и сам знаю где проблема , но я не знаю что делать с этой информацией
0
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
09.01.2018, 05:08
data[field] --> вот тут что должно произойти?
какое значение переменной data и какое значение переменной field?
0
14 / 8 / 7
Регистрация: 09.01.2018
Сообщений: 151
09.01.2018, 05:17  [ТС]
data[field] тяним value из data вставля в fields , field это ключ к нему
вот касательно field
Python
1
for col, field in enumerate(fields):
вот касательно data
Python
1
for row, data in enumerate(datas, start=1):
0
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
09.01.2018, 05:18
нет, нет, я задал вполне конкретные вопросы -
какое значение переменной data и какое значение переменной field непосредственно перед выполнением строки с ошибкой?
0
14 / 8 / 7
Регистрация: 09.01.2018
Сообщений: 151
09.01.2018, 05:20  [ТС]
print(data) и print(field) выдают index
0
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
09.01.2018, 05:21
то есть вы пытаетесь сделать
'index'['index']?
0
14 / 8 / 7
Регистрация: 09.01.2018
Сообщений: 151
09.01.2018, 05:34  [ТС]
Хмм вы наталкиваете меня на мысль что код косячный шо пипец)))
Нужно время что бы разобраться с этой инфой
Хотя скорее ошибка во всех циклах for и поэтому переключения не идёт

Добавлено через 10 минут
Ой натупил конкретно , я вам отписал про print(field) правильно а print(data) с родительского цикла.
Вообщем должно быть так в поле index вписываются данные индекса
Python
1
2
tovname = soup.find('div', class_='catalog_tovname').find('a').text
    index = re.findall('(\d+)',tovname )
если короче то 'index': ['69039']
0
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
09.01.2018, 06:13
все остается в силе - в строке
worksheet.write(row, col, data[field])

в конце вы делаете "index"["index"]
0
14 / 8 / 7
Регистрация: 09.01.2018
Сообщений: 151
09.01.2018, 06:27  [ТС]
Разве ? Разве не так data[field] --> '69039'['index']
0
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
09.01.2018, 08:38
Цитата Сообщение от Mep3avec Посмотреть сообщение
'69039'['index']
даже если бы это было так, лучше от этого точно не стало бы
0
14 / 8 / 7
Регистрация: 09.01.2018
Сообщений: 151
16.01.2018, 23:53  [ТС]
Привет снова))) , во первых рад что топик не закрыли (спасибо админам) , во вторых меня осенило)) начну по порядку.
Итак проблема заключалась вот в этом 'index': ['69039'] , как понятно из [] скобок внутри индекса list , поэтому он и ругается string indices must be integers . Понял я это только полностью переписав массив ибо данные не записывались как надо. И тут я встретился с другой проблемой .Имеем код
Python
1
'lamp': cols[4].split('x')[0].split('<b>')[1],
, который вызывает ошибку TypeError: 'NoneType' object is not callable .Естественно это же числа ,а не строка хм... , решение нашёл в топике на ru.stackoverflow (не уверен можно ли тут топики с сторонних ресурсов располагать) , и вот как теперь выглядит
Python
1
'lamp': cols[4].__str__().split('x')[0].split('<b>')[1]
.
Теперь вопрос как проще всего 'index': ['69039'] превратить в int ? Чтоб не сталкиваться с той же проблемой .
Вот собственно как я его нахожу
Python
1
2
tovname = soup.find('div', class_='catalog_tovname').find('a').text
    index = re.findall('(\d+)',tovname )
Может тут явно сделать его int . Не подскажите?
0
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
17.01.2018, 00:13
Цитата Сообщение от Mep3avec Посмотреть сообщение
Теперь вопрос как проще всего 'index': ['69039'] превратить в int ? Чтоб не сталкиваться с той же проблемой .
что?
0
14 / 8 / 7
Регистрация: 09.01.2018
Сообщений: 151
17.01.2018, 00:14  [ТС]
Как бы оговорюсь , а то кажется что я там откуда начинал . В этом коде
Python
1
2
tovname = soup.find('div', class_='catalog_tovname').find('a').text
    index = re.findall('(\d+)',tovname )
Я явно не прошу index становится листом , и где он им становится мне не понятно или почему.
0
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
17.01.2018, 00:17
Лучший ответ Сообщение было отмечено Mep3avec как решение

Решение

Цитата Сообщение от Mep3avec Посмотреть сообщение
Я явно не прошу index становится листом , и где он им становится мне не понятно или почему.
потому что findall возвращает лист

Добавлено через 40 секунд
попробуйте
Python
1
index = re.search(r'\d+', tovname).group()
Добавлено через 54 секунды
или
Python
1
index = re.findall(r'\d+',tovname )[0]
1
14 / 8 / 7
Регистрация: 09.01.2018
Сообщений: 151
17.01.2018, 00:19  [ТС]
Получилось спасибо , как закончу запись в файлик отпишусь. Ещё раз спасибо ОГРОМНЕЙШЕЕ . (плюсик в карму)

PS. Что значит r' перед '(\d+)'?
0
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
17.01.2018, 01:51
Python
1
tovname = soup.find('div', class_='catalog_tovname').find('a').text
можно заменить на
Python
1
tovname = soup.select_one('div.catalog_tovname a').text
но смысл примерно тот же

Добавлено через 1 час 29 минут
Цитата Сообщение от Mep3avec Посмотреть сообщение
PS. Что значит r' перед '(\d+)'?
читать вступление https://docs.python.org/3/library/re.html
0
14 / 8 / 7
Регистрация: 09.01.2018
Сообщений: 151
17.01.2018, 04:10  [ТС]
Закончил, вот полностью рабочий код
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
def get_html(url):
    html = requests.get(url)
    return html
 
def get_img (html):
    sup_url = 'https://www.lampa.kiev.ua'
    soup = BeautifulSoup(html.text)
    image = sup_url + soup.find('a', class_='multiple').get('href')
    urlretrieve(image , image[37:])
    print(image[37:] , 'download')
    return image
 
 
def get_page_data(html):
    fi = get_img(html)
    gi = fi[37:]
    tf = ''
    group = 'Люстри'
    country = 'Чехія'
    design = 'класичний'
    soup = BeautifulSoup(html.text)
    info = soup.find('div', class_='catalog_hr')#.find_all('b')[5].text
 
    tovname = soup.find('div', class_='catalog_tovname').find('a').text
    index = re.findall('(\d+)', tovname)[0]
 
    datas = []
    for ad in info:
        cols = info.find_all('b')
        datas.append({'index': index,
                    'name': tf,
                    'group': group,
                    'description': tf,
                    'maker': cols[12].text,
                    'country': country,
                    'design': design,
                    'lamp': cols[4].__str__().split('x')[0].split('<b>')[1],
                    'socle': cols[4].__str__().split('x')[1].split('</b>')[0],
                    'color_lamp': cols[9].text,
                    'type_lamp': cols[10].text,
                    'color_stl': cols[7].text,
                    'type_stl': cols[8].text,
                    'heightm': cols[2].text,
                    'width': cols[3].text,
                    'depth': cols[2].text,
                      'photo': gi})
        return datas
 
def save(datas, path):
    with open(path, 'w') as csvfile:
        writer = csv.writer(csvfile)
        writer.writerow(('код товару',
                     'назва серії, модель',
                      'група товару для сайту',
                      'опис',
                      'виробник',
                      'країна',
                      'дизайн',
                      'кількість патронів',
                      'цоколь',
                      'колір плафона',
                      'матеріал плафона',
                      'колір арматури',
                      'матеріал арматури',
                      'розмір (см) Ш',
                      'розмір (см) В',
                      'розмір (см) Г',
                      'фото'))
 
        for data in datas:
            writer.writerow((data['index'], data['name'], data['group'],
                             data['description'], data['maker'], data['country'],
                             data['design'], data['lamp'], data['socle'],
                             data['color_lamp'], data['type_lamp'], data['color_stl'],
                             data['type_stl'], data['heightm'], data['width'], data['depth'],
                             data['photo']))
 
 
 
def main():
    url = 'https://www.lampa.kiev.ua/ua/katalog/89749.html'
    html = get_html(url)
    datas = get_page_data(html)
    print(datas)
    save(datas, 'datas.cvs')
И у меня тут назрело пару вопросов .Во первых почему с 3 строки(на картинке) ?
Во вторых запись я осуществляю постранично и поэтому хорошая ли идея записывать это в csv или лучше к записи в Excel вернутся(то есть писать метод который будет редактировать данные , а не перезаписывать одну и туже строчку)?
Если что на примете openpyxl.
0
14 / 8 / 7
Регистрация: 09.01.2018
Сообщений: 151
17.01.2018, 04:32  [ТС]

Извините не сразу разобрался как картинку вставлять
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.01.2018, 04:32
Помогаю со студенческими работами здесь

Ошибка: string indices must be integers
Здравствуйте! у меня есть словарик выражение a * , я помещаю его в словарик dic = {'key': '*', 'val': 'a'} хочу вывести на экран его...

JSON : TypeError: string indices must be integers
Здравствуйте. Долго объяснять, но когда принтишь price без то все выводится хорошо, в когда с ними то ошибка из заголовка. Вот либа и код:...

list indices must be integers or slices, not tuple
def amount_of_even(a, n, m): summ=0 for i in range(0, n, 2): for j in range(m): if a &gt; 0: summ += 1 return summ ...

List indices must be integers or slices, not tuple
import numpy as np import sys Round = Heroes = Comand = Heroes_cells = ,0),] Hero_index = ,, Round_index =

List indices must be integers or slices, not float
c = float(input()) a = l = 0 r = c while r - l &gt; 1: m = (r + l) // 2 if a &gt; c: r = m else: l...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита табличной части. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru