BeautifulSoup как правильно проверить атрибуты класса на вхождение

robisho

Активный пользователь
Пользователь
Окт 19, 2020
151
26
28
Добрый день. Пишу парсер на python 3.8, requests, BeautifulSoup.
фрагмент html кода страницы

HTML:
<h3 class="day-heading">пятница, 23 октября </h3><div class="class-lines">
<div class="class-line-item">

<div class="class-tails">
<div class="class-time">10:00</div>
<div class="class-tail class-even-week">
<div class="class-pred">Физика</div>
<div class="class-aud">Б209</div>
<div class="class-info">( Лаб. раб., подгруппа 1 )</div>
<div class="class-info"><a href="?prep=1513">Липовченко Е.Л.</a></div>
</div>
<div class="class-tail class-even-week">
<div class="class-pred">Физика</div>
<div class="class-aud">Б209</div>
<div class="class-info">( Лаб. раб., подгруппа 2 )</div>
<div class="class-info"><a href="?prep=1513">Липовченко Е.Л.</a></div>
</div>
<div class="week-delimeter"></div>
<div class="class-tail class-odd-week">свободно</div>
</div>
</div>

<div class="class-line-item">
<div class="class-tails">
<div class="class-time">11:45</div>
<div class="class-tail class-all-week">
<div class="class-pred">Математика</div>
<div class="class-aud">Ж311</div>
<div class="class-info">( Практ.,  )</div>
<div class="class-info"><a href="?prep=1242">Тренева Г.А.</a></div>
</div>
</div>
</div>
<div class="class-line-item">
<div class="class-tails">
<div class="class-time">13:45</div>
<div class="class-tail class-all-week">
<div class="class-pred">Иностранный язык</div>
<div class="class-aud"></div>
<div class="class-info">( Практ., подгруппа 1 )</div>
<div class="class-info"><a href="?prep=None"></a></div>
</div>
<div class="class-tail class-all-week">
<div class="class-pred">Иностранный язык</div>
<div class="class-aud"></div>
<div class="class-info">( Практ., подгруппа 2 )</div>
<div class="class-info"><a href="?prep="></a></div>
</div>
</div>
</div>
<div class="class-line-item">
<div class="class-tails">
<div class="class-time">15:30</div>
<div class="class-tail class-even-week">свободно</div>
<div class="week-delimeter"></div>
<div class="class-tail class-odd-week">
<div class="class-pred">Химия</div>
<div class="class-aud">Д207</div>
<div class="class-info">( Практ.,  )</div>
<div class="class-info"><a href="?prep=1784">Пожидаев Ю.Н.</a></div>

отрывок кода парсера
Python:
class_lines = main_div.find_all('div', class_='class-lines')

for i in class_lines:
    day = i.previous_element
    print('**********************\n')
    print(day)

    class_tails = i.find_all('div', class_='class-tails')

    for pair in class_tails:
        # время начала пары
        time_ = pair.find('div', class_='class-time').text
        print(time_)

        for p in pair.find_all('div', class_='class-tail'):

            if p.get('class') == 'class-all-week':
                print('Общая неделя')

            elif p.get('class') == 'class-even-week':
                print('Четная неделя')

            elif p.get('class') == 'class-odd-week':
                print('Нечетная неделя')


            if p.text == 'свободно':
                data = ('Время свободно')
            else:
                # предмет
                subject = p.find('div', class_='class-pred').text
                # аудитория
                room = p.find('div', class_='class-aud').text
                # лекция/практика
                variant = p.find_all('div', class_='class-info')[0].text
                # препод
                coach = p.find_all('div', class_='class-info')[-1].find('a').text

                data = (subject, room, variant, coach)

            print(*data)

в консоли получаю
Код:
**********************

пятница, 23 октября
10:00
Физика Б209 ( Лаб. раб., подгруппа 1 ) Липовченко Е.Л.
Физика Б209 ( Лаб. раб., подгруппа 2 ) Липовченко Е.Л.
В р е м я   с в о б о д н о
11:45
Математика Ж311 ( Практ.,  ) Тренева Г.А.
13:45
Иностранный язык  ( Практ., подгруппа 1 )
Иностранный язык  ( Практ., подгруппа 2 )
15:30
В р е м я   с в о б о д н о
Химия Д207 ( Практ.,  ) Пожидаев Ю.Н.

не работает только участок кода, где должно определяться и выводиться на печать вид недели(четная, нечетная, общая). пробовал по-всякому, p.has_attr, p.attrs.get, другие варианты, что нагуглил - не работает этот кусок кода. ткните, плз, носом, где я проношу? спасибо.
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Замените эти строки:
Python:
if p.get('class') == 'class-all-week':
    print('Общая неделя')

elif p.get('class') == 'class-even-week':
    print('Четная неделя')

elif p.get('class') == 'class-odd-week':
    print('Нечетная неделя')
на такие:
Python:
if 'class-all-week' in p.attrs['class']:
    print('Общая неделя')

elif 'class-even-week' in p.attrs['class']:
    print('Четная неделя')

elif 'class-odd-week' in p.attrs['class']:
    print('Нечетная неделя')
 
  • Мне нравится
Реакции: robisho

robisho

Активный пользователь
Пользователь
Окт 19, 2020
151
26
28
Замените эти строки:
Python:
if p.get('class') == 'class-all-week':
    print('Общая неделя')

elif p.get('class') == 'class-even-week':
    print('Четная неделя')

elif p.get('class') == 'class-odd-week':
    print('Нечетная неделя')
на такие:
Python:
if 'class-all-week' in p.attrs['class']:
    print('Общая неделя')

elif 'class-even-week' in p.attrs['class']:
    print('Четная неделя')

elif 'class-odd-week' in p.attrs['class']:
    print('Нечетная неделя')
спасибо, получилось)))
 

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