使用解析html表pd.read_html文件其中单元格本身包含完整表

2024-09-30 01:24:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要从html解析一个表,该表在较大的表中嵌套了其他表。正如下面用pd.read_html调用的,这些嵌套表中的每一个都被解析,然后“插入”/“连接”为行。在

我希望将这些嵌套表分别解析为它们自己的pd.DataFrames,并将inserted as objects作为相应列的值。在

如果这是不可能的,那么将嵌套表的原始html作为字符串放在相应的位置就可以了。在

测试代码:

import pandas as pd
df_up = pd.read_html("up_pf00344.test.html", attrs = {'id': 'results'})

输出屏幕截图: Screenshot of table as parsed

以html呈现的表的屏幕截图: Screenshot of table as html

链接到文件:https://gist.github.com/smsaladi/6adb30efbe70f9fed0306b226e8ad0d8#file-up_pf00344-test-html-L62


Tags: 字符串testimportpandasreadobjects屏幕html
1条回答
网友
1楼 · 发布于 2024-09-30 01:24:29

不能使用^{}读取嵌套表,但可以滚动自己的html阅读器,并对表单元格使用read_html

import pandas as pd
import bs4

with open('up_pf00344.test.html') as f:
    html = f.read()
soup = bs4.BeautifulSoup(html, 'lxml')
results = soup.find(attrs = {'id': 'results'})

# get first visible header row as dataframe headers
for row in results.thead.find_all('tr'):
    if 'display:none' not in row.get('style',''):
        df = pd.DataFrame(columns=[col.get_text() for col in row.find_all('th')])
    break

# append all table rows to dataframe
for row in results.tbody.find_all('tr', recursive=False):
    if 'display:none' in row.get('style',''):
        continue
    df_row = []
    for col in row.find_all('td', recursive=False):
        table = col.find_all('table')
        df_row.append(pd.read_html(str(col))[0] if table else col.get_text())
    df.loc[len(df)] = df_row

df.iloc[0].map(type)的结果:

^{pr2}$

好处:由于表行有一个id,因此可以将其用作数据帧df.loc[row.get('id')] = df_row的索引,而不是df.loc[len(df)] = df_row。在

相关问题 更多 >

    热门问题