1. Отримання табличних даних
Що спільного у таблиць і цибулі? Так-так, шари!
Таблиці в HTML являють собою еквівалент шарового пирога, який складається з елементів <table>, <tr> (рядки), <th> (заголовні комірки) і <td> (звичайні комірки). Кожен з цих елементів грає свою роль в представленні даних, і щоб витягти з них інформацію, нам потрібно дістатися до кожного шару послідовно.
Практика, практика і ще раз практика!
Давайте почнемо зі наступної простої HTML-таблиці:
<table>
<tr>
<th>Ім'я</th>
<th>Вік</th>
<th>Місто</th>
</tr>
<tr>
<td>Аліса</td>
<td>29</td>
<td>Москва</td>
</tr>
<tr>
<td>Боб</td>
<td>34</td>
<td>Санкт-Петербург</td>
</tr>
</table>
Крок 1: Пошук таблиці на сторінці
Таблиці на веб-сторінках визначаються HTML-тегами <table>, а дані всередині таблиць знаходяться всередині тегів <tr> (рядки таблиці) і <td> (комірки даних). В BeautifulSoup метод find допоможе знайти першу таблицю на сторінці, а find_all — отримати всі таблиці, якщо їх декілька.
# Пошук першої таблиці на сторінці
table = soup.find("table")
Якщо потрібно витягти конкретну таблицю, можна уточнити пошук, вказавши атрибути таблиці, наприклад, id або class.
# Пошук таблиці за класом
table = soup.find("table", {"class": "table-class"})
Крок 2: Отримання даних із таблиці
Після завантаження, можна приступити до отримання даних. Дані в таблиці розташовані построчно, тому логічним кроком буде пройтись по рядках таблиці і отримати дані з кожної комірки.
Отримання заголовків
Заголовки таблиці, зазвичай, розташовані в першому рядку і укладені в теги <th>. Використання find_all дозволяє зібрати всі заголовки в список.
# Отримання заголовків із першого рядка таблиці
headers = []
header_row = table.find("tr")
for th in header_row.find_all("th"):
headers.append(th.text.strip())
print("Заголовки таблиці:", headers)
Отримання рядків даних
Щоб отримати всі рядки даних (зазвичай укладені в теги <tr>, і кожна комірка — в <td>) використовуємо вкладений цикл: спочатку знаходимо всі рядки <tr>, а потім проходимося по коміркам <td> в кожному рядку.
# Отримання всіх рядків даних
data = []
rows = table.find_all("tr")[1:] # Пропуск першого рядка із заголовками
for row in rows:
row_data = []
for cell in row.find_all("td"):
row_data.append(cell.text.strip())
data.append(row_data)
print("Дані таблиці:", data)
Цей код акуратно перебирає рядки таблиці і отримує текст з кожної комірки. Ну хіба не диво? Звичайно, всі ми знаємо, що не буває чудес без магії циклів!
2. Робота зі списками
Списки — старші брати таблиць
У житті лише два нескінченних об'єкти: таблиці і списки. Списки представлені елементами <ul> (ненумеровані) і <ol> (нумеровані), а їх елементами є <li>. На відміну від таблиць, списки прості і мінімалістичні. Це робить їх ідеальними кандидатами на швидку і ефективну обробку даних!
Отримання даних зі списків
Дивимось на приклад HTML-списка:
<ul>
<li>Яблуко</li>
<li>Банан</li>
<li>Виноград</li>
</ul>
Тепер використовуємо наш старий-добрий BeautifulSoup, щоб отримати ці дані:
html = """
<ul>
<li>Яблуко</li>
<li>Банан</li>
<li>Виноград</li>
</ul>
"""
soup = BeautifulSoup(html, 'html.parser')
ul = soup.find('ul')
items = ul.find_all('li')
for item in items:
print(item.get_text())
Ось і все! Простий, але ефективний підхід, який ви можете застосовувати до більш складних структур.
3. Приклад отримання і обробки табличних даних
Щоб закріпити знання, спробуємо витягти дані з аналогічного прикладу на практиці, але з більш складною структурою:
<table id="courses">
<tr>
<th>Курс</th>
<th>Інструктор</th>
</tr>
<tr>
<td>Python для всіх</td>
<td>Гвідо ван Россум</td>
</tr>
<tr>
<td>Автоматизація з Python</td>
<td>Ерік Маттіес</td>
</tr>
</table>
<ul class="technologies">
<li>Python</li>
<li>JavaScript</li>
<li>HTML & CSS</li>
</ul>
Для отримання даних з таблиці та списку можна налаштувати запити наступним чином:
html = """
<table id="courses">
<tr>
<th>Курс</th>
<th>Інструктор</th>
</tr>
<tr>
<td>Python для всіх</td>
<td>Гвідо ван Россум</td>
</tr>
<tr>
<td>Автоматизація з Python</td>
<td>Ерік Маттіес</td>
</tr>
</table>
<ul class="technologies">
<li>Python</li>
<li>JavaScript</li>
<li>HTML & CSS</li>
</ul>
"""
soup = BeautifulSoup(html, 'html.parser')
# Отримання даних з таблиці
course_table = soup.find('table', id='courses')
course_rows = course_table.find_all('tr')
for row in course_rows:
cells = row.find_all(['th', 'td'])
for cell in cells:
print(cell.get_text())
print("---")
# Отримання даних зі списку
tech_list = soup.find('ul', class_='technologies')
tech_items = tech_list.find_all('li')
for item in tech_items:
print(item.get_text())
Цей скрипт охоплює обидва типи даних. Зверніть увагу, як ми використовуємо ідентифікатори та класи для точного пошуку елементів. На практиці ви можете стикатися з більш складними структурами HTML, але шлях залишається той самий: починаємо з верхнього рівня, розбираємо елементи і, нарешті, отримуємо потрібні дані!
4. Часткові підсумки та поширені помилки
Робота з таблицями і списками на веб-сторінках — це як навігація лабіринтом. Іноді ми можемо зустріти недосконалі дані, такі як пусті комірки або відсутні елементи. У таких випадках важливо перевіряти, що дані коректні і повні. Поширені помилки можуть включати спроби доступу до елементів, яких немає, або неправильне використання селекторів. Важливо пам'ятати, що HTML може бути не таким чистим і структурованим, як хотілося б, тому завжди варто враховувати обробку винятків і перевірку даних.
Де це може знадобитися?
Знання, отримані в цій лекції, допоможуть вам автоматично отримувати та обробляти дані з багатьох онлайн-джерел. Наприклад, ви можете автоматизувати збір даних з таблиць фондів, налаштовувати моніторинг цін в інтернет-магазинах і навіть проводити регулярний аналіз даних з блогів і новинних сайтів. Володіння технікою отримання даних з таблиць і списків відкриває перед вами світ можливостей для автоматизації і аналізу даних.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ