JavaRush /Курси /Python SELF UA /Збір даних з таблиць і списків

Збір даних з таблиць і списків

Python SELF UA
Рівень 32 , Лекція 2
Відкрита

1. Отримання табличних даних

Що спільного у таблиць і цибулі? Так-так, шари!

Таблиці в HTML являють собою еквівалент шарового пирога, який складається з елементів <table>, <tr> (рядки), <th> (заголовні комірки) і <td> (звичайні комірки). Кожен з цих елементів грає свою роль в представленні даних, і щоб витягти з них інформацію, нам потрібно дістатися до кожного шару послідовно.

Практика, практика і ще раз практика!

Давайте почнемо зі наступної простої HTML-таблиці:

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 — отримати всі таблиці, якщо їх декілька.

Python
# Пошук першої таблиці на сторінці
table = soup.find("table")

Якщо потрібно витягти конкретну таблицю, можна уточнити пошук, вказавши атрибути таблиці, наприклад, id або class.

Python

# Пошук таблиці за класом
table = soup.find("table", {"class": "table-class"})

Крок 2: Отримання даних із таблиці

Після завантаження, можна приступити до отримання даних. Дані в таблиці розташовані построчно, тому логічним кроком буде пройтись по рядках таблиці і отримати дані з кожної комірки.

Отримання заголовків

Заголовки таблиці, зазвичай, розташовані в першому рядку і укладені в теги <th>. Використання find_all дозволяє зібрати всі заголовки в список.

Python
# Отримання заголовків із першого рядка таблиці
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> в кожному рядку.

Python

# Отримання всіх рядків даних
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-списка:

HTML

<ul>
 <li>Яблуко</li>
 <li>Банан</li>
 <li>Виноград</li>
</ul>

Тепер використовуємо наш старий-добрий BeautifulSoup, щоб отримати ці дані:

Python

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. Приклад отримання і обробки табличних даних

Щоб закріпити знання, спробуємо витягти дані з аналогічного прикладу на практиці, але з більш складною структурою:

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>

Для отримання даних з таблиці та списку можна налаштувати запити наступним чином:

Python

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 може бути не таким чистим і структурованим, як хотілося б, тому завжди варто враховувати обробку винятків і перевірку даних.

Де це може знадобитися?

Знання, отримані в цій лекції, допоможуть вам автоматично отримувати та обробляти дані з багатьох онлайн-джерел. Наприклад, ви можете автоматизувати збір даних з таблиць фондів, налаштовувати моніторинг цін в інтернет-магазинах і навіть проводити регулярний аналіз даних з блогів і новинних сайтів. Володіння технікою отримання даних з таблиць і списків відкриває перед вами світ можливостей для автоматизації і аналізу даних.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ