У меня есть датафрейм, который состоит из таблиц. Количество столов может быть от 3 до 6 и меняется ежедневно. Я вырезал детали, но вот как выглядит HTML. Существует заголовок таблицы с именем «list-title» и список строк таблицы с именем «list2», которые я успешно извлек через pandas.
<span id="list-title">
ABC(11111)
<br>
</span
<table class="list2">
<tbody>
<tr class = "bg3" </tr>
<tr class = "bg3" </tr>
<tr class = "bg3" </tr>
<tr class = "bg3" </tr>
<tr class = "bg3" </tr>
<tr class = "bg3" </tr>
<tr class = "bg3" </tr>
<tr class = "bg3" </tr>
</tbody>
</table>
<span id="list-title">
DEF(22222)
<br>
</span>
<table class="list2">
<tbody>
<tr class = "bg3" </tr>
<tr class = "bg3" </tr>
<tr class = "bg3" </tr>
<tr class = "bg3" </tr>
<tr class = "bg3" </tr>
<tr class = "bg3" </tr>
<tr class = "bg3" </tr>
<tr class = "bg3" </tr>
</tbody>
</table>
<span id="list-title">
XYZ(33333)
<br>
</span>
<table class="list2">
<tbody>
<tr class = "bg3" </tr>
<tr class = "bg3" </tr>
<tr class = "bg3" </tr>
<tr class = "bg3" </tr>
<tr class = "bg3" </tr>
<tr class = "bg3" </tr>
<tr class = "bg3" </tr>
<tr class = "bg3" </tr>
</tbody>
</table>
Я использовал следующий код для извлечения таблиц и объединил в одну большую таблицу.
import pandas as pd
from bs4 import BeautifulSoup
filename = r'\\server\user\someone\Desktop\test.html'
path = open(filename, 'r')
destination = r"\\server\user\someone\Desktop\test_result.xlsx"
soup = BeautifulSoup(open(filename), 'html.parser')
df = pd.io.html.read_html(filename, encoding='Shift JIS', attrs={'class':'list2'})
df = pd.concat(df)
#remove all rows containing Total
df = df[df.isin({'Total'}).sum(1) == 0]
#Even Rows
df_tmp1 = df.iloc[::2].reset_index(drop=True)
df_tmp1.columns = df.columns.get_level_values(0)
# Odd Rows
df_tmp2 = df.iloc[1::2].reset_index(drop=True)
df_tmp2.columns = df.columns.get_level_values(1)
Что мне нужно сделать, это создать новый столбец и экспортировать информация из "списка-заголовка" в таблице.
broker = soup.find('div', id='mainContents').find_all(id='list-title')[1]
broker = broker.get_text()
df = pd.concat([df_tmp1, df_tmp2], axis=1)
df.insert(5, 'New_Column', broker)
Что делает код выше, так это то, что он добавляет второй заголовок как «брокер» для всех таблиц, а не для каждой таблицы. Я пытался использовать для таких циклов, как
for i in range(3):
df = df[i] = pd.io.html.read_html(filename, encoding='Shift JIS', attrs={'class': 'list2'})
broker = soup.find('div', id='mainContents').find_all(id='list-title')[i]
broker = broker.get_text()
df.insert(5, 'New_Column, broker)
, но это вызывает ошибку. Я думаю, что мне нужно вставить столбец, прежде чем я объединю таблицы, но не знаю, как это сделать.