Конвертировать Pandas DataFrame в html со всеми тегами - PullRequest
0 голосов
/ 07 мая 2019

Этот HTML имеет две таблицы:

'<div class="table-wrap"><table class="wrapped confluenceTable"><colgroup><col/><col/><col/><col/><col/><col/><col/><col/><col/><col/></colgroup><tbody><tr><th class="confluenceTh">Run</th><th class="confluenceTh">Date</th><th class="confluenceTh">Version</th><th class="confluenceTh">Model</th><th class="confluenceTh">OverallPrec</th><th class="confluenceTh">OverallRec</th><th class="confluenceTh"><span>PersonPrec</span></th><th class="confluenceTh"><span>Personrec</span></th><th class="confluenceTh">AnimalF1</th><th class="confluenceTh">VehicleF1</th></tr><tr><td class="confluenceTd">PR-191</td><td class="confluenceTd"><span>15,3/12/19,15:30</span></td><td class="confluenceTd"><span>1.2.191_abcdefg</span></td><td class="confluenceTd"><span>rfcn_dcn_0221</span></td><td class="confluenceTd"><span>0.95</span></td><td class="confluenceTd"><span>0.95</span></td><td class="confluenceTd"><span>0.98</span></td><td class="confluenceTd"><span>0.93</span></td><td class="confluenceTd"><span>0.85</span></td><td class="confluenceTd"><span>0.85</span></td></tr></tbody></table></div><div class="table-wrap"><table class="confluenceTable"><colgroup><col/><col/><col/><col/></colgroup><tbody><tr><th class="confluenceTh">Col1</th><th class="confluenceTh">Col2</th><th class="confluenceTh">Col3</th><th class="confluenceTh"><p>Col4</p></th></tr><tr><td colspan="1" class="confluenceTd">1</td><td colspan="1" class="confluenceTd">2</td><td colspan="1" class="confluenceTd">3</td><td colspan="1" class="confluenceTd">4</td></tr></tbody></table></div>'

df1

      Run              Date          Version          Model  OverallPrec  OverallRec  PersonPrec  Personrec  AnimalF1  VehicleF1
0  PR-191  15,3/12/19,15:30  1.2.191_abcdefg  rfcn_dcn_0221         0.95        0.95        0.98       0.93      0.85       0.85

df2

   Col1  Col2  Col3  Col4
0     1     2     3     4

Я хочу добавить новую строку в df2

df2.loc[len(bdf)] = [2,3,4,5]

, а затем преобразовать его обратно в HTML для публикации.df2.to_html не работает, так как в нем отсутствуют <div>, class и многие другие теги

df2.to_html(classes='confluenceTh')
'<table border="1" class="dataframe confluenceTh">\n  <thead>\n    <tr style="text-align: right;">\n      <th></th>\n      <th>Col1</th>\n      <th>Col2</th>\n      <th>Col3</th>\n      <th>Col4</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>1</td>\n      <td>2</td>\n      <td>3</td>\n      <td>4</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>2</td>\n      <td>3</td>\n      <td>4</td>\n      <td>5</td>\n    </tr>\n  </tbody>\n</table>'

1 Ответ

1 голос
/ 07 мая 2019

При работе с html в виде строк удобной опцией является работа с html-парсером, таким как beautifulsoup.

Вы можете сделать копию одной из строк таблицы для модификации, что позволит вам по существу пропустить обеспечение согласованности класса и других тегов вручную.

import bs4
import copy


test = '<div class="table-wrap"><table class="wrapped confluenceTable"><colgroup><col/><col/><col/><col/><col/><col/><col/><col/><col/><col/></colgroup><tbody><tr><th class="confluenceTh">Run</th><th class="confluenceTh">Date</th><th class="confluenceTh">Version</th><th class="confluenceTh">Model</th><th class="confluenceTh">OverallPrec</th><th class="confluenceTh">OverallRec</th><th class="confluenceTh"><span>PersonPrec</span></th><th class="confluenceTh"><span>Personrec</span></th><th class="confluenceTh">AnimalF1</th><th class="confluenceTh">VehicleF1</th></tr><tr><td class="confluenceTd">PR-191</td><td class="confluenceTd"><span>15,3/12/19,15:30</span></td><td class="confluenceTd"><span>1.2.191_abcdefg</span></td><td class="confluenceTd"><span>rfcn_dcn_0221</span></td><td class="confluenceTd"><span>0.95</span></td><td class="confluenceTd"><span>0.95</span></td><td class="confluenceTd"><span>0.98</span></td><td class="confluenceTd"><span>0.93</span></td><td class="confluenceTd"><span>0.85</span></td><td class="confluenceTd"><span>0.85</span></td></tr></tbody></table></div><div class="table-wrap"><table class="confluenceTable"><colgroup><col/><col/><col/><col/></colgroup><tbody><tr><th class="confluenceTh">Col1</th><th class="confluenceTh">Col2</th><th class="confluenceTh">Col3</th><th class="confluenceTh"><p>Col4</p></th></tr><tr><td colspan="1" class="confluenceTd">1</td><td colspan="1" class="confluenceTd">2</td><td colspan="1" class="confluenceTd">3</td><td colspan="1" class="confluenceTd">4</td></tr></tbody></table></div>'

soup = bs4.BeautifulSoup(test)
tbl = soup.findAll('table')
table_body = tbl[-1].find('tbody') #select last table
rows = table_body.find_all('tr')

new_row = copy.deepcopy(rows[-1]) #select last row, and make a copy

#mutate that copy
cols = new_row.find_all('td')
new_data = [2, 3, 4, 5]
for col, data in zip(cols, new_data):
    col.string = str(data)

table_body.append(new_row) #append at the end of last table selected earlier

with open(r"D:\python\html.html","w") as f:
    f.write(soup.prettify())

Сказав это, вы редко добавляете html после того, как он анализируется таким образом, обычно у вас есть больше контроля, так сказать, перед / во время создания html. Поэтому я бы порекомендовал изучить это как вариант, используя шаблоны на стороне сервера или javascript на стороне клиента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...