Обработка результатов парсинга html из одинаковых class

Всем привет! Делаю парсер, в итоге нужно спарсить жанры для в файл csv (как идут последовательно, могут быть дубликаты).

Код:

import requests
from bs4 import BeautifulSoup

page = requests.get(URL)
print(page.status_code) #Проверка подключения
genres = []
soup = BeautifulSoup(page.text, "html.parser")
genres = soup.findAll('span', class_='selection-film-item-meta__meta-additional-item')
print(genres)

Результат принта: введите сюда описание изображения

Классы в коде сайта совпадают: Классы в коде сайта совпадают

Не понимаю как можно с помощью BS4 оставить только жанр, т.к. на сайте class у страны и у жанра одинаковы полностью и дальше добавить в csv


Ответы (1 шт):

Автор решения: gil9red

Предположим, что у вас всегда теги чередуются: [<страна>, <жанры>, <страна>, <жанры>], тогда можно сделать так, чтобы получить новый начиная со второго элемента и с шагом 2 элемента.

Проверка алгоритма:

items = [1, 2, 3, 4]
print(items[1::2])
# [2, 4]

Проверяем на результате парсинга:

from bs4 import BeautifulSoup


items = ['<span class="selection-film-item-meta__meta-additional-item">США</span>', '<span class="selection-film-item-meta__meta-additional-item">мультфильм, фэнтези</span>', '<span class="selection-film-item-meta__meta-additional-item">США</span>', '<span class="selection-film-item-meta__meta-additional-item">мультфильм, комедия</span>']
items = [BeautifulSoup(x, 'html.parser') for x in items]

genres_els = items[1::2]
print(genres_els)
# [<span class="selection-film-item-meta__meta-additional-item">мультфильм, фэнтези</span>, <span class="selection-film-item-meta__meta-additional-item">мультфильм, комедия</span>]

Работает! Теперь нужно вытащить значения жанров из списка. Для этого перебираем список элементов-жанров, получаем его текст, делаем разделение по ', ':

genres = [el.get_text(strip=True).split(', ') for el in genres_els]
print(genres)
# [['мультфильм', 'фэнтези'], ['мультфильм', 'комедия']]

Если же это нужно в один список добавить, тогда (оператор += позволяет один список в другой распаковывать, аналогом будет функция genres.extend(...)):

genres = []
for el in genres_els:
    genres += el.get_text(strip=True).split(', ')
print(genres)
# ['мультфильм', 'фэнтези', 'мультфильм', 'комедия']

Для удаления дубликатов можно поместить в множество (либо изначально genres сделать множеством):

genres = sorted(set(genres))
print(genres)
# ['комедия', 'мультфильм', 'фэнтези']
→ Ссылка