Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 19, 2020 12:16:42

robisho
Зарегистрирован: 2020-10-19
Сообщения: 60
Репутация: +  2  -
Профиль   Отправить e-mail  

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

Добрый день. Пишу парсер на python 3.8, requests, BeautifulSoup.

фрагмент 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>

отрывок кода парсера

 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, другие варианты, что нагуглил - не работает все равно. ткните, плз, носом, где я ошибаюсь? спасибо.

Офлайн

#2 Окт. 19, 2020 12:47:41

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1396
Репутация: +  124  -
Профиль   Отправить e-mail  

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

может так?
<div class=“class-tail class-even-week”>

 elif p.get('class') == "class-tail class-even-week"

Офлайн

#3 Окт. 19, 2020 13:07:13

robisho
Зарегистрирован: 2020-10-19
Сообщения: 60
Репутация: +  2  -
Профиль   Отправить e-mail  

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

xam1816
может так?<div class=“class-tail class-even-week”>
так тоже пробовал) не работает

Офлайн

#4 Окт. 19, 2020 18:37:08

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1396
Репутация: +  124  -
Профиль   Отправить e-mail  

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

 <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>
По моему мнению в
 for p in pair.find_all('div', class_='class-tail'):
строка ‘class-tail’ не найдется,а найдется в class_tails

 class_tails = i.find_all('div', class_='class-tails')
    for pair in class_tails:
        # время начала пары
        time_ = pair.find('div', class_='class-time').text
# должен быть в class_tails
        week = pair.find('div', class_='class-tail class-even-week')

Офлайн

#5 Окт. 19, 2020 20:37:44

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10026
Репутация: +  857  -
Профиль   Отправить e-mail  

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

robisho
Пишу парсер
Опиши задачу точно. Что должен сделать парсер в результате?



Офлайн

#6 Окт. 19, 2020 20:44:25

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2849
Репутация: +  186  -
Профиль   Отправить e-mail  

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

> так тоже пробовал) не работает

 "class-all-week" in p.attrs.get("class", [])



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version