如何解析固定结构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
相关产品推荐
相关产品推荐

