Автор оригинала: Naazneen Jatu.
Чтение и запись HTML-таблиц с помощью Панд
Вступление
Язык гипертекстовой разметки (HTML) – это стандартный язык разметки для создания веб-страниц. Мы можем визуализировать табличные данные с помощью HTML-элемента . Библиотека анализа данных Pandas предоставляет такие функции, как
read_html()
и to_html ()
, поэтому мы можем импортировать и экспортировать данные в фреймы данных.
В этой статье мы узнаем, как считывать табличные данные из HTML-файла и загружать их в фрейм данных Pandas. Мы также узнаем, как записывать данные из фрейма данных Pandas и в HTML-файл.
Примечание: В этой статье мы будем читать и писать HTML элементы. Эта статья не включает в себя синтаксический анализ всего HTML-файла.
Чтение HTML
Мы можем читать таблицы HTML-файла с помощью функции read_html ()
. Эта функция считывает таблицы HTML-файлов в виде фреймов данных Pandas. Он может читать из файла или URL-адреса.
Давайте посмотрим на каждый источник входного сигнала один за другим.
Чтение HTML-Данных Из файла
Для этого раздела мы будем использовать один набор входных данных. Одна таблица содержит языки программирования и год их создания. В другой таблице указаны размеры земельных участков и их стоимость в долларах США.
Сохраните следующее HTML-содержимое в файле с именем table_data.html
:
Table Data
Programming Language | Creator | Year |
---|---|---|
C | Dennis Ritchie | 1972 |
Python | Guido Van Rossum | 1989 |
Ruby | Yukihiro Matsumoto | 1995 |
Area (sq.ft) | Price (USD) |
---|---|
12000 | 500 |
32000 | 700 |
Pandas нуждается в помощи другой библиотеки, называемой lxml
для анализа HTML-и XML-файлов. Для работы функции read_html()
вам необходимо установить lxml
:
$ pip install lxml
После установки lmxl
мы можем использовать функцию read_html ()
. Он возвращает список фреймов данных, где каждый фрейм данных является целым элементом таблицы данного HTML-файла. Мы обращаемся к каждой таблице как к фрейму данных, индексируя список.
Приведенный ниже код демонстрирует использование функции 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
, вам не нужно импортировать его в свою программу, чтобы панды работали.
Выполнение приведенного выше кода на интерпретаторе 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-веб-страницы в фрейм данных с помощью read_html()
. Однако вместо имени файла мы предоставим такой URL-адрес:
read_html('https://en.wikipedia.org/wiki/Python_(programming_language)')
И он вернет список фреймов данных, где каждый фрейм данных представляет элемент таблицы из данного 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
, если сайт требует аутентификации.
Этот метод возвращает объект ответа с веб-страницы. Мы можем проверить код состояния (чтобы убедиться, что содержимое определенно есть) и получить текст из объекта ответа, а затем преобразовать таблицу в фрейм данных.
Давайте рассмотрим пример использования 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-таблицы в качестве фреймов данных.
Давайте придерживаться более раннего URL-адреса и использовать requests
для чтения HTML-таблиц в качестве фреймов данных. В то время как предыдущий сайт был общедоступным, шаги для доступа к аутентифицированному контенту те же.
Как только мы получим ответ, мы можем передать метод r.text
в read_html ()
. И, как обычно, мы получим список таблиц, которые он содержит в виде фреймов данных:
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’s Pandas
Мы успешно прочитали данные из HTML-таблиц. Давайте запишем фрейм данных Pandas в HTML-файл. Это может быть достигнуто с помощью метода to_html ()
.
to_html()
принимает путь к файлу, в который вы хотите экспортировать данные. Если вы не укажете абсолютный путь, он сохранит файл относительно текущего каталога.
Вы можете экспортировать фрейм данных в HTML-таблицу следующим образом:
import pandas as pd df = pd.DataFrame({'A': [1, 2], 'B': [3, 4]}) df.to_html('write_html.html')
Этот код создаст следующий файл write_html.html
в текущем
A | B | |
---|---|---|
0 | 1 | 3 |
1 | 2 | 4 |
Обратите внимание, что экспорт-это не весь HTML-документ, а только HTML-код
Написание стилизованных HTML таблиц с пандами Python
Как мы видим, по умолчанию граница таблицы равна 1, выравнивание правильное, и она также имеет индексы фреймов данных в тегах . Мы можем изменить эту структуру по умолчанию, предоставив несколько необязательных параметров.
Скрыть индекс
Если мы не хотим включать индекс в вывод таблицы, мы можем установить 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
файл со следующим содержимым:
A | B |
---|---|
1 | 3 |
2 | 4 |
Граница Пеленального столика
Граница таблицы по умолчанию составляет 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”:
A | B | |
---|---|---|
0 | 1 | 3 |
1 | 2 | 4 |
Выравнивание текста
По умолчанию текст заголовка таблицы выровнен по правому краю. Мы меняем это выравнивание с помощью параметра justify
. Например, выполнение justify="center"
добавит style="text-align: center;"
в тег тега
.
Давайте попробуем выровнять текст заголовка по центру и посмотрим результаты:
import pandas as pd df = pd.DataFrame({'A': [1, 'AAA'], 'B': ['BBB', 4]}) df.to_html('write_html.html', justify='center')
Таблица, созданная приведенным выше кодом, выглядит следующим образом:
A | B | |
---|---|---|
0 | 1 | BBB |
1 | AAA | 4 |
Текст заголовка таблицы теперь красиво выровнен по центру.
Вывод
В этом уроке мы узнали, как импортировать и экспортировать данные HTML-таблиц с помощью фреймов данных Pandas. Мы загрузили данные HTML-таблицы из файлов, а также из URL-адресов веб – страниц. В случае аутентифицированных URL-адресов мы использовали модуль запросов для аутентификации и извлечения данных сайта, а затем передали текст ответа в функцию read_html ()
.
Мы также написали фрейм данных Pandas в виде HTML-файла с помощью функции to_html ()
. Затем мы стилизовали сгенерированную таблицу, передав несколько необязательных параметров, таких как index
, border
и justify
. Это позволяет легко записывать данные фрейма данных в презентационной манере.