Найти - Пользователи
Полная версия: BeautifulSoup как правильно проверить атрибуты класса на вхождение
Начало » Python для новичков » BeautifulSoup как правильно проверить атрибуты класса на вхождение
1
robisho
Добрый день. Пишу парсер на 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, другие варианты, что нагуглил - не работает все равно. ткните, плз, носом, где я ошибаюсь? спасибо.
xam1816
может так?
<div class=“class-tail class-even-week”>

 elif p.get('class') == "class-tail class-even-week"
robisho
xam1816
может так?<div class=“class-tail class-even-week”>
так тоже пробовал) не работает
xam1816
 <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')
py.user.next
robisho
Пишу парсер
Опиши задачу точно. Что должен сделать парсер в результате?
Rodegast
> так тоже пробовал) не работает
 "class-all-week" in p.attrs.get("class", [])
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB