Найти - Пользователи
Полная версия: Проблема с парсингом BeautifulSoup
Начало » Python для новичков » Проблема с парсингом BeautifulSoup
1
polygraph
Здравствуйте, у меня имеется страница html, где есть расписание пар.

 <div class="table-responsive">
   <table class="table table-striped table-boxed table-bordered responsive" id="schedule_table">
      <thead>
         <tr>
            <th width="4%">Пара</th>
            <th class="schedule-table-top-header" width="17%">Понедельник <br/> (13.09.2021)</th>
            <th class="schedule-table-top-header" width="16%">Вторник <br/> (14.09.2021)</th>
            <th class="schedule-table-top-header" width="16%">Среда <br/> (15.09.2021)</th>
            <th class="schedule-table-top-header" width="16%">Четверг <br/> (16.09.2021)</th>
            <th class="schedule-table-top-header" width="16%">Пятница <br/> (17.09.2021)</th>
            <th class="schedule-table-top-header" width="16%">Суббота <br/> (18.09.2021)</th>
         </tr>
      </thead>
      <tbody id="schedule_table_tbody">
         <tr>
            <td>1</td>
           <!-- Понедельник--> <td></td> 
           <!-- Вторник--> <td></td>
           <!-- Среда--> <td></td>
           <!-- Четверг--> <td></td>
           <!-- Пятница--> <td></td>
           <!-- Суббота--> <td></td>
         </tr>
         <tr>
            <td>2</td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
         </tr>
         <tr>
            <td>3</td>
            <td title="12:00 – 13:30">
               <h5 class="text-highlight">Математика</h5>
               (пр)<br/><i aria-hidden="true" class="fa fa-clock-o"></i> 12:00 – 13:30<br/><i aria-hidden="true" class="fa fa-user-o"></i> <a href="/person/1234" target="_blank">Иванов И.И.</a><br/><b><i aria-hidden="true" class="fa fa-map-marker"></i> 10-505</b><br/>
            </td>
            <td></td>
            <td></td>
            <td title="12:00 – 13:30">
               <h5 class="text-highlight">Информатика</h5>
               <i>(В образовании)</i><br/> (лаб)<br/><i aria-hidden="true" class="fa fa-clock-o"></i> 12:00 – 13:30<br/><i aria-hidden="true" class="fa fa-user-o"></i> <a href="/person/131" target="_blank">Иванов И.И</a><br/><b><i aria-hidden="true" class="fa fa-map-marker"></i> 10-505</b><br/><b>Подгруппа 1</b><br/>
               <hr/>
               <i aria-hidden="true" class="fa fa-user-o"></i> <a href="/person/466" target="_blank">Иванов И.И</a><br/><b><i aria-hidden="true" class="fa fa-map-marker"></i> 10-505</b><br/><b>Подгруппа 2</b><br/>
            </td>
            <td></td>
            <td></td>
         </tr>
         <tr>
            <td>4</td>
            <td title="13:40 – 15:10">
               <h5 class="text-highlight">Информатика</h5>
               (лек)<br/><i aria-hidden="true" class="fa fa-clock-o"></i> 13:40 – 15:10<br/><i aria-hidden="true" class="fa fa-user-o"></i> <a href="/person/151" target="_blank">Петров А.А.</a><br/><b><i aria-hidden="true" class="fa fa-map-marker"></i> 10-50</b><br/>
            </td>
            <td title="13:40 – 15:10">
               <h5 class="text-highlight">Высшая математика</h5>
               <i>(В образовании)</i><br/> (лек)<br/><i aria-hidden="true" class="fa fa-clock-o"></i> 13:40 – 15:10<br/><i aria-hidden="true" class="fa fa-user-o"></i> <a href="/person/5704" target="_blank">Петров А.Н.</a><br/><b><i aria-hidden="true" class="fa fa-map-marker"></i> 10-55</b><br/>
            </td>
            <td title="13:40 – 15:10">
               <h5 class="text-highlight">Базы данных</h5>
               <i>(В образовании)</i><br/> (лек)<br/><i aria-hidden="true" class="fa fa-clock-o"></i> 13:40 – 15:10<br/><i aria-hidden="true" class="fa fa-user-o"></i> <a href="/person/3686" target="_blank">Петров А.В.</a><br/><b><i aria-hidden="true" class="fa fa-map-marker"></i> 9-505</b><br/>
            </td>
            <td title="13:40 – 15:10">
               <h5 class="text-highlight">Информатика</h5>
               <i>(В образовании)</i><br/> (лаб)<br/><i aria-hidden="true" class="fa fa-clock-o"></i> 13:40 – 15:10<br/><i aria-hidden="true" class="fa fa-user-o"></i> <a href="/person/131" target="_blank">Петров К.А.</a><br/><b><i aria-hidden="true" class="fa fa-map-marker"></i> 8-700</b><br/><b>Подгруппа 1</b><br/>
               <hr/>
               <i aria-hidden="true" class="fa fa-user-o"></i> <a href="/person/466" target="_blank">Волков В.Н.</a><br/><b><i aria-hidden="true" class="fa fa-map-marker"></i> 10-505</b><br/><b>Подгруппа 2</b><br/>
            </td>
            <td title="13:40 – 15:10">
               <h5 class="text-highlight">Информатика</h5>
               <i>(В образовании)</i><br/> (лек)<br/><i aria-hidden="true" class="fa fa-clock-o"></i> 13:40 – 15:10<br/><i aria-hidden="true" class="fa fa-user-o"></i> <a href="/person/466" target="_blank">Петров К.А..</a><br/><b><i aria-hidden="true" class="fa fa-map-marker"></i> 10-50</b><br/>
            </td>
            <td></td>
         </tr>
         <tr>
            <td>5</td>
            <td title="15:20 – 16:50">
               <h5 class="text-highlight">Математика</h5>
               <i>(В образовании)</i><br/> (лек)<br/><i aria-hidden="true" class="fa fa-clock-o"></i> 15:20 – 16:50<br/><i aria-hidden="true" class="fa fa-user-o"></i> <a href="/person/5704" target="_blank">Петров А.В.</a><br/><b><i aria-hidden="true" class="fa fa-map-marker"></i> 10-50</b><br/>
            </td>
            <td title="15:20 – 16:50">
               <h5 class="text-highlight">Программирование на языке Python</h5>
               <i>(В образовании))</i><br/> (лек)<br/><i aria-hidden="true" class="fa fa-clock-o"></i> 15:20 – 16:50<br/><i aria-hidden="true" class="fa fa-user-o"></i> <a href="/person/139" target="_blank">Петров А.В.</a><br/><b><i aria-hidden="true" class="fa fa-map-marker"></i> 10-50</b><br/>
            </td>
            <td title="15:20 – 16:50">
               <h5 class="text-highlight">Информатика</h5>
               <i>(В образовании))</i><br/> (лек)<br/><i aria-hidden="true" class="fa fa-clock-o"></i> 15:20 – 16:50<br/><i aria-hidden="true" class="fa fa-user-o"></i> <a href="/person/139" target="_blank">Петров А.В.</a><br/><b><i aria-hidden="true" class="fa fa-map-marker"></i> 10-50</b><br/>
            </td>
            <td title="15:20 – 16:50">
               <h5 class="text-highlight">Физ-ра</h5>
               <i>(В образовании)</i><br/> (лек)<br/><i aria-hidden="true" class="fa fa-clock-o"></i> 15:20 – 16:50<br/><i aria-hidden="true" class="fa fa-user-o"></i> <a href="/person/466" target="_blank">Петров А.В.</a><br/><b><i aria-hidden="true" class="fa fa-map-marker"></i> 10-50</b><br/>
            </td>
            <td title="15:20 – 16:50">
               <h5 class="text-highlight">Программирование на языке Python</h5>
               (лек)<br/><i aria-hidden="true" class="fa fa-clock-o"></i> 15:20 – 16:50<br/><i aria-hidden="true" class="fa fa-user-o"></i> <a href="/person/3679" target="_blank">Петров А.В.</a><br/><b><i aria-hidden="true" class="fa fa-map-marker"></i> 10-50</b><br/>
            </td>
            <td></td>
         </tr>
         <tr>
            <td>6</td>
            <td></td>
            <td></td>
            <td></td>
            <td title="17:00 – 18:30">
               <h5 class="text-highlight">Программирование на языке Python</h5>
               (лек)<br/><i aria-hidden="true" class="fa fa-clock-o"></i> 17:00 – 18:30<br/><i aria-hidden="true" class="fa fa-user-o"></i> <a href="/person/151" target="_blank">Иванов А.В.</a><br/><b><i aria-hidden="true" class="fa fa-map-marker"></i> 10-50</b><br/>
            </td>
            <td title="17:00 – 18:30">
               <h5 class="text-highlight">Физ-ра</h5>
               (лек)<br/><i aria-hidden="true" class="fa fa-clock-o"></i> 17:00 – 18:30<br/><i aria-hidden="true" class="fa fa-user-o"></i> <a href="/person/1234" target="_blank">Иванов А.Б.</a><br/><b><i aria-hidden="true" class="fa fa-map-marker"></i> 10-50</b><br/>
            </td>
            <td></td>
         </tr>
         <tr>
            <td>7</td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
         </tr>
         <tr>
            <td>8</td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
         </tr>
      </tbody>
   </table>
</div>

в тегах tr имеются td. Первый td - это пара по счету, далее теги td это дни недели - Понедельник..Суббота.
Проблема в том, что не могу разобраться как мне лучше спарсить, чтобы получилось вот так:

Понедельник
(13.09.2021)
1 - Нет пары (т.к. td пуст)
2 - Нет пары
3 Математика (пр)
12:00 – 13:30
Иванов И.И.
10-505
4 Информатика (лек)
13:40 – 15:10
Петров А.А.
10-50
5 Математика
(В образовании)
(лек)
15:20 – 16:50
Петров А.В.
10-50
6 - Нет пары
7 - Нет пары
8 - Нет пары


и т.п.

вот что у меня есть на данный момент

 def parse_table():
    with open('table.html', encoding='utf-8') as file:
        src = file.read()
    soup = BeautifulSoup(src, "lxml")
    table = soup.find('table', attrs={'id': 'schedule_table'})
    stud = table.findAll('tbody', attrs={'id': 'schedule_table_tbody'})
    cells = []
    for row in table.findAll("td"):
        cells.append(row.text)
    print(cells)
parse_table()
py.user.next
polygraph
Проблема в том, что не могу разобраться как мне лучше спарсить, чтобы получилось вот так:
Ты пытаешься сделать всё за один раз. А надо разделить один алгоритм на множество алгоритмов и подключить их друг к другу по цепочке. Получается такое ветвистое дерево из алгоритмов, в котором алгоритмы растут друг из друга, как ветки растут из ствола и маленькие ветки растут из других веток.

Из алгоритма разбора расписания должен запускаться алгоритм нахождения дней недели и алгоритм нахождения всех пар. А из алгоритма нахождения дней недели должен запускаться алгоритм определения точных дат. А из алгоритма нахождения всех пар должен запускаться алгоритм нахождения одной пары и алгоритм очистки всех полей одной пары. Алгоритм нахождения одной пары должен найти пару и передать её алгоритму очистки всех полей одной пары. В алгоритме нахождения одной пары участвует только BeautifulSoup. А в алгоритме очистки всех полей одной пары участвуют средства для работы со строками. В результате у тебя должен получиться словарь с днями недели, к которым привязано число и список пар, где каждая пара может быть словарём тоже. И вот когда у тебя этот словарь словарей есть, ты из него и выводишь данные на экран или в файл или по сети.
xam1816
polygraph
Проблема в том, что не могу разобраться как мне лучше спарсить, чтобы получилось вот так:
 from bs4 import BeautifulSoup
with open('html.html',encoding='utf-8') as file:
	html = file.read()
def parse_table(html):
	out = []
	soup = BeautifulSoup(html,'lxml')
	table = soup.find('table')
	rows = table.find_all('tr')
	for row in rows:
		col = row.find_all(['td','th'])
		temp = []
		for elem in col:
			temp.append(elem.getText())
		out.append(temp)
	return out
my_table = parse_table(html)
for i in my_table:
	print(f"{i[0]}       {i[1].strip() if i[1] != '' else 'нет пары'}")

Вывод:
 Пара       Понедельник  (13.09.2021)
1       нет пары
2       нет пары
3       Математика
               (пр) 12:00 – 13:30 Иванов И.И. 10-505
4       Информатика
               (лек) 13:40 – 15:10 Петров А.А. 10-50
5       Математика
(В образовании) (лек) 15:20 – 16:50 Петров А.В. 10-50
6       нет пары
7       нет пары
8       нет пары
Process finished with exit code 0
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