You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解析固定结构HTML表格并转换为指定格式DataFrame?

问题解决:将特定结构HTML表格转换为目标格式DataFrame

问题背景

有一个结构固定、仅数据值变化的HTML表格,代码如下:

html = '''
<table align="center">
    <tr>
        <th>Name</th>
        <td>NAME A</td>
        <th>Status</th>
        <td class="IN PROGRESS">IN PROGRESS</td>
    </tr>
    <tr>
        <th>Category</th>
        <td COLSPAN="3">CATEGORY A</td>
    </tr>
    <tr>
        <th>Creation date</th>
        <td>13/01/23 23:00</td>
        <th>End date</th>
        <td></td>
    </tr>
</table>
'''

使用pandas.read_html()直接转换时,会因colspan属性导致格式异常:

import pandas as pd
print(pd.read_html(html)[0])

输出:

0               1           2            3
0           Name          NAME A      Status  IN PROGRESS
1       Category      CATEGORY A  CATEGORY A   CATEGORY A
2  Creation date  13/01/23 23:00    End date          NaN

期望得到的DataFrame格式为:

Name    Category     Status     Creation date  End date
0  NAME A  CATEGORY A  IN PROGRESS  13/01/23 23:00       NaN

解决方案:用BeautifulSoup解析后构建DataFrame

利用BeautifulSoup遍历表格行,提取每个<th>对应的<td>值,处理colspan的情况,最终整理成键值对再转换为DataFrame:

from bs4 import BeautifulSoup
import pandas as pd

soup = BeautifulSoup(html, 'lxml')
table = soup.find('table')
data = {}

for row in table.find_all('tr'):
    cells = row.find_all(['th', 'td'])
    i = 0
    while i < len(cells):
        if cells[i].name == 'th':
            key = cells[i].get_text(strip=True)
            value_cell = cells[i+1]
            value = value_cell.get_text(strip=True) if value_cell.get_text(strip=True) else None
            data[key] = value
            # 处理colspan,跳过对应数量的单元格
            colspan = int(value_cell.get('colspan', 1))
            i += colspan + 1
        else:
            i += 1

# 转换为DataFrame并按期望顺序排列列
df = pd.DataFrame([data], columns=['Name', 'Category', 'Status', 'Creation date', 'End date'])
print(df)

输出结果

Name    Category     Status     Creation date End date
0  NAME A  CATEGORY A  IN PROGRESS  13/01/23 23:00     None

说明

  • 遍历每一行的单元格,以<th>文本作为DataFrame列名,对应<td>文本作为值
  • 针对colspan属性,自动跳过对应数量的单元格,避免重复读取数据
  • 空内容的<td>会被转换为None,在DataFrame中显示为NaN

内容的提问来源于stack exchange,提问作者VERBOSE

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 07:13:36