Вступление
Язык гипертекстовой разметки (HTML) - это стандартный язык разметки
для создания веб-страниц. Мы можем отображать табличные данные с помощью
элемента <table>
Библиотека анализа данных Pandas предоставляет такие
функции, как read_html()
и to_html()
поэтому мы можем импортировать
и экспортировать данные в DataFrames.
В этой статье мы узнаем, как читать табличные данные из файла HTML и загружать их в Pandas DataFrame. Мы также узнаем, как записывать данные из Pandas DataFrame и в файл HTML.
Примечание. В этой статье мы будем читать и писать элементы
<table>
В этой статье не рассматривается анализ всего HTML-файла.
Чтение HTML
Мы можем читать таблицы HTML-файла с помощью функции read_html()
. Эта
функция считывает таблицы файлов HTML как Pandas DataFrames. Он может
читать из файла или URL-адреса.
Давайте посмотрим на каждый источник ввода один за другим.
Чтение данных HTML из файла
В этом разделе мы будем использовать один набор входных данных. Одна таблица содержит языки программирования и год их создания. В другой таблице указаны размеры земель и их стоимость в долларах США.
Сохраните следующий HTML-контент в файле с именем table_data.html
:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Table Data</title>
</head>
<body>
<table>
<thead>
<tr>
<th>Programming Language</th>
<th>Creator</th>
<th>Year</th>
</tr>
</thead>
<tbody>
<tr>
<td>C</td>
<td>Dennis Ritchie</td>
<td>1972</td>
</tr>
<tr>
<td>Python</td>
<td>Guido Van Rossum</td>
<td>1989</td>
</tr>
<tr>
<td>Ruby</td>
<td>Yukihiro Matsumoto</td>
<td>1995</td>
</tr>
</tbody>
</table>
<table>
<thead>
<tr>
<th>
Area (sq.ft)
</th>
<th>
Price (USD)
</th>
</tr>
</thead>
<tbody>
<tr>
<td>
12000
</td>
<td>
500
</td>
</tr>
<tr>
<td>
32000
</td>
<td>
700
</td>
</tr>
</tbody>
</table>
</body>
</html>
Pandas нуждается в помощи другой библиотеки, называемой lxml
для
анализа файлов HTML и XML. Для работы функции read_html()
необходимо
установить lxml
:
$ pip install lxml
После установки lmxl
мы можем использовать read_html()
. Он
возвращает список DataFrames, где каждый DataFrame является целым
элементом таблицы данного HTML-файла. Мы получаем доступ к каждой
таблице как к DataFrame, индексируя список.
В приведенном ниже коде демонстрируется использование функции
read_html()
для чтения таблиц из файла HTML:
import pandas as pd
tables = pd.read_html('table_data.html')
print('Tables found:', len(tables))
df1 = tables[0] # Save first table in variable df1
df2 = tables[1] # Saving next table in variable df2
print('First Table')
print(df1)
print('Another Table')
print(df2)
Примечание . Хотя вам нужно lxml
, вам не нужно импортировать его
в свою программу для работы Pandas.
Выполнение приведенного выше кода в интерпретаторе Python приведет к следующему результату:
Tables found: 2
First Table
Programming Language Creator Year
0 C Dennis Ritchie 1972
1 Python Guido Van Rossum 1989
2 Ruby Yukihiro Matsumoto 1995
Another Table
Area (sq.ft) Price (USD)
0 12000 500
1 32000 700
Чтение данных HTML из URL
Так же, как мы читаем элементы таблицы из файла HTML, мы также можем
читать элементы таблицы с веб-страницы HTML в DataFrame с помощью
read_html()
. Однако вместо имени файла мы предоставим URL-адрес,
подобный этому:
read_html('https://en.wikipedia.org/wiki/Python_(programming_language)')
И он вернет список DataFrames, где каждый DataFrame представляет элемент таблицы из заданного URL-адреса.
Вот пример кода для чтения элементов таблицы с URL-адреса веб-сайта с помощью Pandas:
import pandas as pd
tables = pd.read_html('https://en.wikipedia.org/wiki/Python_(programming_language)')
print('Tables found:', len(tables))
df1 = tables[0] # Save first table in variable df1
print('First Table')
print(df1.head()) # To print first 5 rows
Если мы успешно выполним приведенный выше код, мы увидим результат как:
Tables found: 10
First Table
0 1
0 NaN NaN
1 Paradigm Multi-paradigm: functional, imperative, object...
2 Designed by Guido van Rossum
3 Developer Python Software Foundation
4 First appeared 1991; 29 years ago[1]
Чтение данных HTML из URL, требующего аутентификации
Мы знаем, что можем считывать элементы таблицы с веб-сайта. Однако, когда сайт требует аутентификации, код сталкивается со следующим исключением:
raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 401: UNAUTHORIZED
Для чтения данных с таких URL-адресов мы будем использовать модуль
requests
Вы можете установить его с помощью pip
:
$ pip install requests
Теперь мы будем использовать метод get()
из requests
чтобы сделать
запрос на URL-адрес веб-сайта, предоставив необязательный auth
если
сайт требует аутентификации.
Этот метод возвращает объект ответа с веб-страницы. Мы можем проверить код состояния (чтобы убедиться, что контент определенно присутствует) и получить текст из объекта ответа, а затем преобразовать таблицу в DataFrame.
Давайте посмотрим на пример использования requests
для получения
данных, требующих аутентификации. Для этого мы используем
https://httpbin.org :
import requests
r = requests.get('https://httpbin.org/basic-auth/john/johnspassword', auth=('john', 'johnspassword'))
print(r.status_code)
print(r.text)
Выполнив приведенный выше код, мы можем увидеть следующий результат:
200
{
"authenticated": true,
"user": "john"
}
Это показывает, что мы успешно получили доступ к содержимому веб-страницы аутентифицированного URL-адреса. Однако этот веб-сайт содержит только данные JSON, и нам нужны элементы таблицы HTML как DataFrames.
Давайте придерживаться более раннего URL-адреса и будем использовать
requests
для чтения HTML-таблиц как DataFrames. Хотя предыдущий сайт
был общедоступным, шаги для доступа к аутентифицированному контенту
такие же.
Получив ответ, мы можем передать r.text
read_html()
. И, как обычно,
мы получим список содержащихся в нем таблиц в виде DataFrames:
import pandas as pd
import requests
# Can use auth parameter for authenticated URLs
r = requests.get('https://en.wikipedia.org/wiki/Python_(programming_language)',
auth=('john', 'johnspassword'))
tables = pd.read_html(r.text)
print('Tables found:', len(tables))
df1 = tables[0]
print('First Table')
print(df1.head())
Запуск этого кода приведет к следующему результату:
Tables found: 10
First Table
0 1
0 NaN NaN
1 Paradigm Multi-paradigm: functional, imperative, object...
2 Designed by Guido van Rossum
3 Developer Python Software Foundation
4 First appeared 1991; 29 years ago[1]
Написание HTML-таблиц с помощью Python Pandas
Мы успешно прочитали данные из HTML-таблиц. Напишем Pandas DataFrame в
HTML-файле. Этого можно добиться с помощью to_html()
.
to_html()
берет путь к файлу, в который вы хотите экспортировать
данные. Если вы не укажете абсолютный путь, файл будет сохранен
относительно текущего каталога.
Вы можете экспортировать DataFrame в таблицу HTML следующим образом:
import pandas as pd
df = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df.to_html('write_html.html')
Этот код создаст следующий файл write_html.html
в текущем каталоге:
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>A</th>
<th>B</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td>1</td>
<td>3</td>
</tr>
<tr>
<th>1</th>
<td>2</td>
<td>4</td>
</tr>
</tbody>
</table>
Обратите внимание, что экспортируется не весь HTML-документ, а только сама HTML-таблица.
Написание стилизованных HTML-таблиц с помощью Python Pandas
Как мы видим, по умолчанию граница таблицы равна 1, выравнивание
правильное, а также индексы DataFrame в тегах <th>
Мы можем изменить
эту структуру по умолчанию, указав несколько дополнительных параметров.
Скрыть указатель
Если мы не хотим включать индекс в вывод таблицы, мы можем установить
index=False
в to_html()
:
import pandas as pd
df = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df.to_html('write_html.html', index=False)
Этот код создает write_html.html
со следующим содержимым:
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th>A</th>
<th>B</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>3</td>
</tr>
<tr>
<td>2</td>
<td>4</td>
</tr>
</tbody>
</table>
Изменение границы таблицы
Граница таблицы по умолчанию - 1 пиксель. Чтобы изменить это значение по
умолчанию, мы можем установить для border
значение в пикселях.
Следующий код изменяет границу на 3 пикселя:
import pandas as pd
df = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df.to_html('write_html.html', border=3)
Сгенерированный файл теперь устанавливает для атрибута границы таблицы значение «3»:
<table border="3" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>A</th>
<th>B</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td>1</td>
<td>3</td>
</tr>
<tr>
<th>1</th>
<td>2</td>
<td>4</td>
</tr>
</tbody>
</table>
Выровнять текст
По умолчанию текст заголовка таблицы выравнивается по правому краю. Мы
меняем это выравнивание с помощью параметра justify
Например,
выполнение justify="center"
добавит style="text-align: center;"
в
<tr>
тега <thead>
.
Попробуем выровнять текст заголовка по центру и посмотреть результат:
import pandas as pd
df = pd.DataFrame({'A': [1, 'AAA'], 'B': ['BBB', 4]})
df.to_html('write_html.html', justify='center')
Таблица, созданная приведенным выше кодом, выглядит так:
<table border="1" class="dataframe">
<thead>
<tr style="text-align: center;">
<th></th>
<th>A</th>
<th>B</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td>1</td>
<td>BBB</td>
</tr>
<tr>
<th>1</th>
<td>AAA</td>
<td>4</td>
</tr>
</tbody>
</table>
Текст заголовка таблицы теперь красиво выровнен по центру.
Заключение
В этом руководстве мы узнали, как импортировать и экспортировать данные
таблицы HTML с помощью Pandas DataFrames. Мы загружали данные
HTML-таблицы из файлов, а также из URL-адресов веб-страниц. В случае
аутентифицированных URL-адресов мы использовали модуль запросов для
аутентификации и получения данных сайта, а затем read_html()
.
Мы также написали Pandas DataFrame в виде HTML-файла с помощью функции
to_html()
. Затем мы стилизовали созданную таблицу, передав несколько
необязательных параметров, таких как index
, border
и justify
.
Это упрощает запись данных DataFrame в презентационной манере.