,
| ,
|
HTML-таблицы структурируют данные в строки и столбцы. Ключевые теги:
<table>: Определяет таблицу.
<tr>: Определяет строку таблицы (table row).
<th>: Определяет заголовочную ячейку (table header).
<td>: Определяет ячейку данных (table data).
Понимание этой структуры – основа для эффективного извлечения данных с помощью BeautifulSoup.
Установка и настройка библиотеки BeautifulSoup
Установка BeautifulSoup выполняется с помощью pip:
pip install beautifulsoup4
pip install lxml # Рекомендуется для более быстрого парсинга
Для использования необходимо импортировать библиотеку и указать парсер. lxml значительно ускоряет обработку HTML, но можно использовать и встроенный html.parser.
from bs4 import BeautifulSoup
html_doc = """
<html><head><title>Пример таблицы</title></head>
<body>
<table id="example_table">
<tr>
<th>Header 1</th>
<th>Header 2</th>
</tr>
<tr>
<td>Data 1</td>
<td>Data 2</td>
</tr>
</table>
</body>
</html>
"""
soup = BeautifulSoup(html_doc, 'lxml')
Извлечение данных из HTML-таблиц с помощью BeautifulSoup
Поиск таблицы по тегу
или атрибутам (id, class)
Для поиска таблицы используется метод find() или find_all():
from bs4 import BeautifulSoup
# Предположим, что soup уже содержит распарсенный HTML
table = soup.find('table') # Поиск первой таблицы
table_by_id = soup.find('table', {'id': 'example_table'}) # Поиск таблицы по ID
tables_by_class = soup.find_all('table', {'class': 'data-table'}) # Поиск всех таблиц с определенным классом
Итерация по строкам (
) и ячейкам (
| ,
| )
После нахождения таблицы можно итерироваться по строкам и ячейкам:
from bs4 import BeautifulSoup
from typing import List
def extract_table_data(table: BeautifulSoup) -> List[List[str]]:
"""Extracts data from an HTML table.
Args:
table: BeautifulSoup object representing the table.
Returns:
A list of lists, where each inner list represents a row and contains the text from each cell.
"""
data: List[List[str]] = []
rows = table.find_all('tr')
for row in rows:
cells = row.find_all(['td', 'th'])
row_data: List[str] = [cell.text.strip() for cell in cells]
data.append(row_data)
return data
# Предположим, что table уже содержит BeautifulSoup объект таблицы
data = extract_table_data(table_by_id)
for row in data:
print(row)
Доступ к содержимому ячеек: text, get_text(), string
Для извлечения текста из ячеек используйте атрибут .text или метод .get_text():
.text: Возвращает текст элемента и всех его потомков.
.get_text(): Аналогичен .text, но позволяет указать разделитель.
.string: Возвращает текст, только если элемент содержит ровно один текстовый узел. Если есть другие теги внутри, вернет None.
Продвинутые методы извлечения данных из таблиц
Извлечение данных с учетом заголовков таблицы (
| )
Можно связать данные ячеек с соответствующими заголовками. Например, создать словарь, где ключи – заголовки столбцов, а значения – данные из ячеек.
from bs4 import BeautifulSoup
from typing import Dict, List
def extract_table_with_headers(table: BeautifulSoup) -> List[Dict[str, str]]:
"""Extracts data from an HTML table, associating data with headers.
Args:
table: BeautifulSoup object representing the table.
Returns:
A list of dictionaries, where each dictionary represents a row and contains data associated with headers.
"""
headers: List[str] = [th.text.strip() for th in table.find_all('th')]
data: List[Dict[str, str]] = []
rows = table.find_all('tr')[1:] # Пропускаем строку с заголовками
for row in rows:
cells = row.find_all('td')
row_data: Dict[str, str] = {}
for i, cell in enumerate(cells):
row_data[headers[i]] = cell.text.strip()
data.append(row_data)
return data
# table_by_id is a BeautifulSoup object representing the table
data = extract_table_with_headers(table_by_id)
for row in data:
print(row)
Обработка сложных таблиц с rowspan и colspan
Атрибуты rowspan и colspan указывают, сколько строк или столбцов занимает ячейка. Обработка таких таблиц требует более сложной логики, чтобы правильно сопоставить данные.
Извлечение атрибутов тегов (например, ссылки из ячеек)
Чтобы извлечь атрибуты тегов, используйте синтаксис cell.find('a')['href'] (для извлечения ссылки из ячейки).
from bs4 import BeautifulSoup
html_doc = """
<html><body>
<table>
<tr>
<td><a href="https://example.com">Example Link</a></td>
</tr>
</table>
</body></html>
"""
soup = BeautifulSoup(html_doc, 'lxml')
table = soup.find('table')
row = table.find('tr')
cell = row.find('td')
link = cell.find('a')['href']
print(link) # Output: https://example.com
Преобразование извлеченных данных в структурированный формат
Создание списков (lists) и словарей (dictionaries) на основе данных из таблицы
Как показано выше, извлеченные данные удобно преобразовывать в списки или словари для дальнейшей обработки.
Использование Pandas DataFrame для работы с табличными данными
Pandas DataFrame – мощный инструмент для работы с табличными данными. Он позволяет легко фильтровать, сортировать, агрегировать и визуализировать данные.
import pandas as pd
from bs4 import BeautifulSoup
from typing import List, Dict
def table_to_dataframe(table: BeautifulSoup) -> pd.DataFrame:
"""Converts an HTML table to a Pandas DataFrame.
Args:
table: BeautifulSoup object representing the table.
Returns:
A Pandas DataFrame.
"""
headers: List[str] = [th.text.strip() for th in table.find_all('th')]
data: List[List[str]] = []
rows = table.find_all('tr')[1:] # Skip header row
for row in rows:
cells = row.find_all('td')
row_data: List[str] = [cell.text.strip() for cell in cells]
data.append(row_data)
df = pd.DataFrame(data, columns=headers)
return df
# table_by_id is a BeautifulSoup object representing the table
df = table_to_dataframe(table_by_id)
print(df)
Экспорт данных в CSV или другие форматы
Pandas DataFrame позволяет легко экспортировать данные в различные форматы, включая CSV, Excel, JSON и другие.
df.to_csv('table_data.csv', index=False)
Примеры и лучшие практики
Пример 1: Извлечение таблицы курсов валют с сайта
(Предполагается, что сайт содержит таблицу с курсами валют и ее структура известна. Пример кода будет аналогичен приведенным выше, с адаптацией под конкретный сайт.)
Пример 2: Парсинг таблицы с результатами спортивных соревнований
(Аналогично, потребуется анализ HTML структуры страницы с результатами.)
Рекомендации по обработке ошибок и исключений при парсинге таблиц
- Используйте
try...except блоки для обработки возможных исключений (например, отсутствие таблицы или ячейки).
- Проверяйте наличие элементов перед обращением к ним, чтобы избежать
AttributeError.
- Реализуйте логирование для отслеживания ошибок и упрощения отладки.
- Учитывайте возможные изменения в структуре HTML страницы и будьте готовы к адаптации кода.
Добавить комментарий
| | |