Функция Pandas pd.read_html()

Python math 模块Pandas: общие функции


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ОписаниеЗначение по умолчанию
iostr, объект пути, файлоподобный объектПуть к HTML-файлу, URL или строкаОбязательный
совпадениеstr, regexИспользуйте регулярные выражения для сопоставления текстового содержимого таблицы'.+'
flavorstrПарсер: 'lxml', 'html5lib', 'bs4'Отсутствует
headerint, список intНомер строки, используемый в качестве имён столбцовОтсутствует
index_colint, strСтолбец, используемый в качестве индекса строкОтсутствует
skiprowsint, list, sliceПропустить указанные строкиОтсутствует
attrsdictАтрибуты HTML-тегов, используемые для фильтрации таблицОтсутствует
parse_datesbool, listСледует ли анализировать столбцы с датамиFalse

Возвращаемое значение

  • Тип возвращаемого значения:list DataFrame-ов
  • Возвращает список объектов DataFrame; количество возвращённых объектов DataFrame соответствует количеству таблиц на странице.
  • Если подходящая таблица не найдена, возвращает пустой список.

Примеры

С помощью следующих примеров всесторонне освойтеread_html()различные варианты использования.

Пример 1: Чтение таблицы из локального HTML-файла

Сначала создайте HTML-файл, содержащий таблицу, затем используйтеread_html()чтобы прочитать его.

Пример

import pandas as pd

# Создать 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

Когда на странице есть несколько таблиц, можно использовать сопоставление по атрибутам или тексту, чтобы отфильтровать нужные таблицы.

Пример

import pandas as pd

# Создайте 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-таблицы могут иметь сложные форматы, поэтому заголовки и индексы нужно обрабатывать гибко.

h2 class="example">Пример
import pandas as pd

# Создать 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 позволяет эффективно извлекать нужные данные со сложных страниц. Читателям рекомендуется отдавать приоритет этой функции, когда нужно парсить веб-таблицы.

Python math 模块Pandas: общие функции

Другие расширения