Чтение и запись HTML-таблиц с помощью Pandas

Введение. Язык гипертекстовой разметки (HTML) - это стандартный язык разметки для создания веб-страниц. Мы можем отображать табличные данные с помощью HTML<table> элемент. Библиотека анализа данных Pandas предоставляет такие функции, как read_html () и to_html (), поэтому мы можем импортировать и экспортировать данные в DataFrames. В этой статье мы узнаем, как читать табличные данные из файла HTML и загружать их в Pandas DataFrame. Мы также узнаем, как записывать данные из Pandas DataFrame и в файл HTML. Примечание: в этом

Вступление

Язык гипертекстовой разметки (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 в презентационной манере.

comments powered by Disqus