Как сохранить данные в словарь с несколькими значениями у ключей

AndrewKon

Новичок
Пользователь
Ноя 20, 2022
15
1
1
Всем привет!
При парсинге сайта возникла потребность получить словарь заголовков h1-3 страницы вида:
{ 'h1' : 'Заголовок с h1', 'h2' : [Заголовок-1 c h2, Заголовок-2 с h2], 'h3' : [Заголовок-1 c h3, Заголовок-2 с h3, Заголовок-3 с h3]}
В результате исполнения кода я получаю только последние значения заголовков, например, на странице 5 штук h3 заголовков, а я в словаре в конце работы скрипта получаю только последний. Понимаю, что нужно использовать .append, но как его сюда внедрить не пойму. d['h1'] = d['h1'].append(то что нужно добавить) - не работает.

Python:
d = {}
for heading in soup.find_all("h1"):
    d['h1'] = heading.text.strip().replace("\n"," ")
for heading in soup.find_all("h2"):
    d['h2'] = heading.text.strip().replace("\n"," ")
for heading in soup.find_all("h3"):
    d['h3'] = heading.text.strip().replace("\n"," ")
Результат кода:
{'h1': 'Расчетный счет', 'h2': 'Частые вопросы', 'h3': 'Расчетный счет для юридических лиц'}
 

robisho

Активный пользователь
Пользователь
Окт 19, 2020
151
26
28
думаю, так должно получится

Python:
d = {}
for heading in soup.find_all("h1"):
    d['h1'] = heading.text.strip().replace("\n"," ")
for headings in soup.find_all("h2"):
    if len(headings) > 1:
        head_lst = []
        for heading in headings:
            head_lst.append(heading.text.strip().replace("\n"," "))
        d['h2'] = head_lst
    else:
        d['h2'] = headings.text.strip().replace("\n"," ")
for headings in soup.find_all("h3"):
    if len(headings) > 1:
        head_lst = []
        for heading in headings:
            head_lst.append(heading.text.strip().replace("\n"," "))
        d['h3'] = head_lst
    else:
        d['h3'] = headings.text.strip().replace("\n"," ")
 
  • Мне нравится
Реакции: AndrewKon

AndrewKon

Новичок
Пользователь
Ноя 20, 2022
15
1
1
думаю, так должно получится

Python:
d = {}
for heading in soup.find_all("h1"):
    d['h1'] = heading.text.strip().replace("\n"," ")
for headings in soup.find_all("h2"):
    if len(headings) > 1:
        head_lst = []
        for heading in headings:
            head_lst.append(heading.text.strip().replace("\n"," "))
        d['h2'] = head_lst
    else:
        d['h2'] = headings.text.strip().replace("\n"," ")
for headings in soup.find_all("h3"):
    if len(headings) > 1:
        head_lst = []
        for heading in headings:
            head_lst.append(heading.text.strip().replace("\n"," "))
        d['h3'] = head_lst
    else:
        d['h3'] = headings.text.strip().replace("\n"," ")
Принцип понял, но в результате все равно получается словарь с последними тегами. Например, на этой странице https://www.tinkoff.ru/business/account/ooo/ попадает только {'h1': 'Расчетный счет ООО', 'h2': 'Популярные вопросы', 'h4': 'Помощь'} где Популярные вопросы и Помощь - последние заги.
 

robisho

Активный пользователь
Пользователь
Окт 19, 2020
151
26
28
Принцип понял, но в результате все равно получается словарь с последними тегами. Например, на этой странице https://www.tinkoff.ru/business/account/ooo/ попадает только {'h1': 'Расчетный счет ООО', 'h2': 'Популярные вопросы', 'h4': 'Помощь'} где Популярные вопросы и Помощь - последние заги.
попробуйте во вложенных циклах for отследить состояние head_lst с помощью print(head_lst). будет видно, как и что пишется в список.
 

AndrewKon

Новичок
Пользователь
Ноя 20, 2022
15
1
1
попробуйте во вложенных циклах for отследить состояние head_lst с помощью print(head_lst). будет видно, как и что пишется в список.
Он в if не заходит. Я принты добавил перед for и в if:

Python:
    for headings in soup.find_all("h4"):
        print("headings h4 ", headings)
        if len(headings) > 1:
            head_lst = []
            for heading in headings:
                head_lst.append(heading.text.strip().replace("\n"," "))
                print("heal_lst ", head_lst)
            d['h4'] = head_lst
        else:
            d['h4'] = headings.text.strip().replace("\n"," ")
Результаты
Код:
headings h4  <h4 class="ebvRJhfok">Открыть счет ООО</h4>
headings h4  <h4 class="ab78Lfl1m"><p>Удобный платежный день</p></h4>
headings h4  <h4 class="ab78Lfl1m"><p>Персональный менеджер</p></h4>
headings h4  <h4 class="abp8DstWJ fbp8DstWJ"><p>Простой</p></h4>
headings h4  <h4 class="ebvKof69F">Подключить</h4>
headings h4  <h4 class="abp8DstWJ fbp8DstWJ"><p>Продвинутый</p></h4>
headings h4  <h4 class="ebvKof69F">Подключить</h4>
headings h4  <h4 class="abp8DstWJ fbp8DstWJ"><p>Профессиональный</p></h4>
headings h4  <h4 class="ebvKof69F">Подключить</h4>
headings h4  <h4 class="abp8DstWJ fbp8DstWJ"><p>Премиальное обслуживание</p></h4>
headings h4  <h4 class="ebvKof69F">Подключить</h4>
headings h4  <h4 class="ab78Lfl1m"><p>Карты для бизнеса</p></h4>
headings h4  <h4 class="ab78Lfl1m"><p>Валютный контроль и счета</p></h4>
headings h4  <h4 class="abQ6VyFZ0 ab0C7q7bB gbQ6VyFZ0 sbQ6VyFZ0"><p>Тарифы</p></h4>
headings h4  <h4 class="abQ6VyFZ0 ab0C7q7bB gbQ6VyFZ0 sbQ6VyFZ0"><p><b>Помощь</b></p></h4>
 

robisho

Активный пользователь
Пользователь
Окт 19, 2020
151
26
28
Он в if не заходит. Я принты добавил перед for и в if:

Python:
    for headings in soup.find_all("h4"):
        print("headings h4 ", headings)
        if len(headings) > 1:
            head_lst = []
            for heading in headings:
                head_lst.append(heading.text.strip().replace("\n"," "))
                print("heal_lst ", head_lst)
            d['h4'] = head_lst
        else:
            d['h4'] = headings.text.strip().replace("\n"," ")
Результаты
Код:
headings h4  <h4 class="ebvRJhfok">Открыть счет ООО</h4>
headings h4  <h4 class="ab78Lfl1m"><p>Удобный платежный день</p></h4>
headings h4  <h4 class="ab78Lfl1m"><p>Персональный менеджер</p></h4>
headings h4  <h4 class="abp8DstWJ fbp8DstWJ"><p>Простой</p></h4>
headings h4  <h4 class="ebvKof69F">Подключить</h4>
headings h4  <h4 class="abp8DstWJ fbp8DstWJ"><p>Продвинутый</p></h4>
headings h4  <h4 class="ebvKof69F">Подключить</h4>
headings h4  <h4 class="abp8DstWJ fbp8DstWJ"><p>Профессиональный</p></h4>
headings h4  <h4 class="ebvKof69F">Подключить</h4>
headings h4  <h4 class="abp8DstWJ fbp8DstWJ"><p>Премиальное обслуживание</p></h4>
headings h4  <h4 class="ebvKof69F">Подключить</h4>
headings h4  <h4 class="ab78Lfl1m"><p>Карты для бизнеса</p></h4>
headings h4  <h4 class="ab78Lfl1m"><p>Валютный контроль и счета</p></h4>
headings h4  <h4 class="abQ6VyFZ0 ab0C7q7bB gbQ6VyFZ0 sbQ6VyFZ0"><p>Тарифы</p></h4>
headings h4  <h4 class="abQ6VyFZ0 ab0C7q7bB gbQ6VyFZ0 sbQ6VyFZ0"><p><b>Помощь</b></p></h4>
ну тогда так
Python:
head_lst = []
for heading in soup.find_all("h4"):
    head_lst.append(heading.text.strip().replace("\n"," "))
    print("heading h4 ", heading)
d['h4'] = head_lst
 
  • Мне нравится
Реакции: AndrewKon

AndrewKon

Новичок
Пользователь
Ноя 20, 2022
15
1
1
ну тогда так
Python:
head_lst = []
for heading in soup.find_all("h4"):
    head_lst.append(heading.text.strip().replace("\n"," "))
    print("heading h4 ", heading)
d['h4'] = head_lst
Спасибо, заработала шарманка!
 
  • Мне нравится
Реакции: robisho

Форум IT Специалистов