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 может быть не столь чистым и структурированным, как хотелось бы, поэтому всегда стоит учитывать обработку исключений и проверку валидности данных.
Где это может пригодиться?
Знания, полученные в этой лекции, помогут вам автоматически извлекать и обрабатывать данные из множества онлайн-источников. Например, вы можете автоматизировать сбор данных из таблиц фонда обмена, настраивать мониторинг цен в интернет-магазинах и даже проводить регулярный анализ данных из блогов и новостных сайтов. Владение техникой извлечения данных из таблиц и списков открывает перед вами мир возможностей для автоматизации и анализа данных.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ