Функция Pandas pd.read_html()
read_html()Это функция в библиотеке pandas, используемая для разбора HTML-таблиц; она может читать табличные данные с веб-страниц или из HTML-файлов и преобразовывать их в DataFrame.
Табличные данные на веб-страницах являются очень важным источником данных. Многие публичные наборы данных (например, информация об акциях, статистические данные и т. д.) представлены в виде HTML-таблиц.read_html()ИспользованиеlxmlиBeautifulSoupБиблиотека для парсинга HTML, она может автоматически извлекать все таблицы или указанные таблицы со страницы.
Базовый синтаксис и параметры
Формат синтаксиса
pandas.read_html(io, match='.+', flavor=None, header=None, index_col=None,
skiprows=None, attrs=None, parse_dates=False, thousands=',',
decimal='.', converters=None, ...)
Описание параметра
| Параметр | Type | Описание | Значение по умолчанию |
|---|---|---|---|
| io | str, объект пути, файлоподобный объект | Путь к HTML-файлу, URL или строка | Обязательный |
| совпадение | str, regex | Используйте регулярные выражения для сопоставления текстового содержимого таблицы | '.+' |
| flavor | str | Парсер: 'lxml', 'html5lib', 'bs4' | Отсутствует |
| header | int, список int | Номер строки, используемый в качестве имён столбцов | Отсутствует |
| index_col | int, str | Столбец, используемый в качестве индекса строк | Отсутствует |
| skiprows | int, list, slice | Пропустить указанные строки | Отсутствует |
| attrs | dict | Атрибуты HTML-тегов, используемые для фильтрации таблиц | Отсутствует |
| parse_dates | bool, list | Следует ли анализировать столбцы с датами | False |
Возвращаемое значение
- Тип возвращаемого значения:
listDataFrame-ов - Возвращает список объектов DataFrame; количество возвращённых объектов DataFrame соответствует количеству таблиц на странице.
- Если подходящая таблица не найдена, возвращает пустой список.
Примеры
С помощью следующих примеров всесторонне освойтеread_html()различные варианты использования.
Пример 1: Чтение таблицы из локального HTML-файла
Сначала создайте HTML-файл, содержащий таблицу, затем используйтеread_html()чтобы прочитать его.
Пример
# Создать HTML-файл, содержащий таблицу
html_content = '''
<title>Таблица с информацией о сотрудниках</title>
<h1>Функция Pandas pd-read-html()</h1>
<table border="1" class="employee-table">
<tr>
<th>Имя</th>
<th>Возраст</th>
<th>Город</th>
<th>Зарплата</th>
</tr>
<tr>
<td>Том</td>
<td>28</td>
<td>Пекин</td>
<td>8000</td>
</tr>
<tr>
<td>Джерри</td>
<td>35</td>
<td>Шанхай</td>
<td>12000</td>
</tr>
<tr>
<td>Майк</td>
<td>42</td>
<td>Гуанчжоу</td>
<td>15000</td>
</tr>
<tr>
<td>Люси</td>
<td>26</td>
<td>Шэньчжэнь</td>
<td>7000</td>
</tr>
</table>
<h2>Список отделов</h2>
<table border="1">
<tr>
<th>Отдел</th>
<th>Численность</th>
</tr>
<tr>
<td>Технологический отдел</td>
<td>50</td>
</tr>
<tr>
<td>Отдел продаж</td>
<td>30</td>
</tr>
</table>
'''
# Записать HTML в файл
with open('tables.html'⟧3⟧encoding, 'w', encoding='utf-8') as f:
f.write(html_content)
# Используйте read_html для чтения всех таблиц
# io: путь к HTML-файлу (обязательно)
tables = .read_html('tables.html')
# Просмотр результатов чтения
print(f"Найдено {len(tables)} таблиц")
print()
# Перебрать все таблицы
for i, df in enumerate(tables):
print(f"--- Table {i+1} ---")
print(df)
print()
Ожидаемый вывод:
共找到 2 个表格
--- 表格 1 ---
姓名 年龄 城市 薪资
0 Tom 28 Beijing 8000
1 Jerry 35 Shanghai 12000
2 Mike 42 Guangzhou 15000
3 Lucy 26 Shenzhen 7000
--- 表格 2 ---
部门 人数
0 技术部 50
1 销售部 30
Пояснение к коду:
read_html()Возвращает список DataFrame, каждая таблица соответствует одному DataFrame.- По умолчанию читаются все таблицы.
- Первая строка автоматически распознаётся как имена столбцов (потому что есть
thтеги).
Пример 2: Фильтрация таблиц с помощью attrs и match
Когда на странице есть несколько таблиц, можно использовать сопоставление по атрибутам или тексту, чтобы отфильтровать нужные таблицы.
Пример
# Создайте HTML-файл с атрибутами
html_with_attrs = '''
<table id="employees" class="data-table">
<tr><th>name</th><th>age</th></tr>
<tr><td>Tom</td><td>28</td></tr>
<tr><td>Jerry</td><td>35</td></tr>
</table>
<table id="products" class="data-table">
<tr><th>product</th><th>price</th></tr>
<tr><td>A</td><td>100</td></tr>
<tr><td>B</td><td>200</td></tr>
</table>
<table class="summary">
<tr><td>Всего</td><td>2</td></tr>
</table>
'''
with open('tables_attrs.html', 'w', encoding='utf-8') as f:
f.write(html_with_attrs)
# Пример 2a: Использование attrs для фильтрации по атрибуту id
# Чтение таблицы с id="employees"
tables_by_id = pd.read_html('tables_attrs.html', attrs={'id': 'employees'})
print("Использование id для фильтрации:")
print(tables_by_id[0])
print()
# Пример 2b: Использование attrs для фильтрации по атрибуту class
# Чтение всех таблиц с class="data-table"
tables_by_class = pd.read_html('tables_attrs.html', attrs={'class': 'data-table'})
print("Использование класса для фильтрации (найдено {} таблиц):".format(len(tables_by_class)))
for i, df in enumerate(tables_by_class):
print(f"Таблица {i+1}:")
print(df)
print()
# Пример 2c: использование match для фильтрации таблиц, содержащих определённый текст
# match использует регулярные выражения для сопоставления текста в таблицах
tables_by_text = pd.read_html('tables_attrs.html', match='Tom')
print("Таблицы, содержащие текст 'Tom':")
print(tables_by_text[0])
Ожидаемый вывод:
使用 id 筛选: name age 0 Tom 28 1 Jerry 35 使用 class 筛选 (找到 2 个表格): 表格 1: name age 0 Tom 28 1 Jerry 35 表格 2: product price 0 A 100 1 B 200 包含 'Tom' 文本的表格: name age 0 Tom 28 1 Jerry 35
Пояснение к коду:
attrsПараметр может указывать атрибуты HTML-тега (такие как id, class, style и т. д.) для фильтрации таблиц.matchПараметр использует регулярные выражения для сопоставления текстового содержимого таблицы и возвращает таблицы, содержащие совпадающий текст.- Когда возвращается только одна таблица, можно использовать
tables[0]для получения первого DataFrame.
Пример 3: Обработка заголовков и индексов
HTML-таблицы могут иметь сложные форматы, поэтому заголовки и индексы нужно обрабатывать гибко.
# Создать HTML со сложной структурой
html_complex = '''
<!-- Таблица без заголовка -->
<table id="no_header">
<tr><td>Tom</td><td>28</td></tr>
<tr><td>Jerry</td><td>35</td></tr>
</table>
<!-- Многострочный заголовок -->
<table id="multi_header">
<tr><th>Имя</th><th colspan="2">Контактная информация</th></tr>
<tr><th></th><th>Телефон</th><th>Электронная почта</th></tr>
<tr><td>Tom</td><td>123456</td><td>[email protected]</td></tr>
<tr><td>Jerry</td><td>789012</td><td>[email protected]</td></tr>
</table>
<!-- Таблица с атрибутами -->
<table id="with_index" data-type="employee">
<tr><th>Имя</th><th>Возраст</th><th>Город</th></tr>
<tr><th></th><th></th><th></th></tr>
<tr><td>Tom</td><td>28</td><td>Пекин</td></tr>
</table>
'''
with open('tables_complex.html', 'w', encoding='utf-8') as f:
f.write(html_complex)
# Пример 3a: случай без заголовка
# header=None не использует первую строку как имена столбцов
df_no_header = pd.read_html('tables_complex.html', attrs={'id': 'no_header'}, header=None)[0]
print("Без заголовка:")
print(df_no_header)
print()
# Пример 3b: Многострочный заголовок
# Используйте строку 0 и строку 1 вместе в качестве заголовка
df_multi_header = pd.read_html('tables_complex.html', attrs={'id': 'multi_header'})[0]
print("Многострочный заголовок:")
print(df_multi_header)
print()
# Пример 3c: Задайте столбец индекса
# index_col задаёт столбец 0 как индекс
df_with_index = pd.read_html('tables_complex.html', attrs={'id': 'with_index'}, index_col=0)[0]
print("Setting index:")
print(df_with_index)
Ожидаемый вывод:
没有表头:
0 1
0 Tom 28
1 Jerry 35
多行表头:
姓名 联系方式
NaN 电话 邮箱
0 Tom 123456 [email protected]
1 Jerry 789012 [email protected]
设置索引:
年龄 城市
姓名
Tom 28 Beijing
</空行>
空字符串 NaN NaN
Tom 28 Beijing
Пояснение к коду:
header=NoneВы можете отключить автоматическое распознавание заголовков и использовать целочисленный индекс по умолчанию в качестве имён столбцов.- Многострочные заголовки обрабатываются как MultiIndex.
index_colПараметр может указывать столбец, который будет использоваться в качестве индекса строк.
Примечания
- Использование
read_html()требует установкиlxmlбиблиотека:pip install lxml。 - Он возвращает список DataFrame; вам нужно выбрать конкретную таблицу по индексу.
- Если на странице несколько таблиц, используйте
attrsилиmatchпараметр для фильтрации. read_html()Он попытается разобрать все таблицы, что может быть медленным. Для больших страниц можно использоватьmatchпараметр, чтобы сузить область поиска.- Для чтения веб-страниц требуется поддержка сети, а также могут действовать ограничения доступа или механизмы защиты от краулинга.
Итог
read_html()Это мощный инструмент в pandas для чтения данных HTML-таблиц. Он может автоматически разбирать таблицы на веб-страницах и преобразовывать их в структурированный формат DataFrame.
В практической работе, если вам нужно получать данные с веб-страниц,read_html()это очень практичный выбор. Освоение использования параметров attrs и match позволяет эффективно извлекать нужные данные со сложных страниц. Читателям рекомендуется отдавать приоритет этой функции, когда нужно парсить веб-таблицы.
Pandas: общие функции