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

robisho

Новичок
Пользователь
Окт 19, 2020
26
4
3
Добрый день. Пишу парсер на 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
991
449
63
Замените эти строки:
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
26
4
3
Замените эти строки:
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 Специалистов