Вот рабочий пример универсального <table>
. (Хотя ваша страница не используется из-за необходимости выполнения JavaScript для загрузки данных таблицы)
Извлечение данных таблицы из здесь ВВП (валовой внутренний продукт) по странам.
htmltable = soup.find('table', { 'class' : 'table table-striped' })
# where the dictionary specify unique attributes for the 'table' tag
Ниже функция анализирует сегмент html, начинающийся с тега <table>
, за которым следуют несколько тегов <tr>
(строки таблицы) и внутренние теги <td>
(данные таблицы). Он возвращает список строк с внутренними столбцами. Принимает только один <th>
(заголовок/данные таблицы) в первой строке.
def tableDataText(table):
"""Parses a html segment started with tag <table> followed
by multiple <tr> (table rows) and inner <td> (table data) tags.
It returns a list of rows with inner columns.
Accepts only one <th> (table header/data) in the first row.
"""
def rowgetDataText(tr, coltag='td'): # td (data) or th (header)
return [td.get_text(strip=True) for td in tr.find_all(coltag)]
rows = []
trs = table.find_all('tr')
headerow = rowgetDataText(trs[0], 'th')
if headerow: # if there is a header row include first
rows.append(headerow)
trs = trs[1:]
for tr in trs: # for every table row
rows.append(rowgetDataText(tr, 'td') ) # data row
return rows
С его помощью получаем (первые две строки).
list_table = tableDataText(htmltable)
list_table[:2]
[['Rank',
'Name',
"GDP (IMF '19)",
"GDP (UN '16)",
'GDP Per Capita',
'2019 Population'],
['1',
'United States',
'21.41 trillion',
'18.62 trillion',
'$65,064',
'329,064,917']]
Его можно легко преобразовать в pandas.DataFrame
для более сложных манипуляций.
import pandas as pd
dftable = pd.DataFrame(list_table[1:], columns=list_table[0])
dftable.head(4)
![введите описание изображения здесь](https://i.stack.imgur.com/I6BDf.png)
person
eusoubrasileiro
schedule
07.10.2019