JavaRush /Курсы /Python SELF /Сбор данных из таблиц и списков

Сбор данных из таблиц и списков

Python SELF
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 может быть не столь чистым и структурированным, как хотелось бы, поэтому всегда стоит учитывать обработку исключений и проверку валидности данных.

Где это может пригодиться?

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

Комментарии (4)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Анатолий Уровень 53
17 февраля 2026
❤️
Long_byte Уровень 60
13 августа 2025
по больше бы задач как epic
Long_byte Уровень 60
11 августа 2025
print([li.get_text() for li in soup.find('ul').find_all('li')]) почему не проходит этот вариант
Vlad Tagunkov Уровень 17
8 января 2025
у вас в шаге 2 съехали отступы в цикле на питоне.