如何处理跨多行分布数据的HTML表格并导入pandas DataFrame
解决多行分布的HTML表格转pandas DataFrame问题
你遇到的这种每行对应一个字段键值对的表格,直接用pd.read_html确实会把每个字段拆成零散的行,没法直接得到结构化的DataFrame。我给你整理了一套实用的处理方案:
步骤1:解析表格行并提取键值对
首先我们要遍历BeautifulSoup拿到的所有表格行,跳过开头的记录数行,把每行里的字段名和对应值提取出来,整理成字典:
from bs4 import BeautifulSoup import pandas as pd # 假设你已经有了解析好的soup对象,先定位到目标表格 table = soup.find('table') rows = table.find_all('tr') # 初始化字典存储单条记录的键值对 record_data = {} # 跳过第一行("Record : 1 of 749" 这条无关数据) for row in rows[1:]: cells = row.find_all('td') # 确保当前行有足够的单元格(字段名、冒号、值) if len(cells) >= 3: # 提取字段名,去掉多余空格 field_name = cells[0].get_text(strip=True) # 提取字段值(示例里值在第3个td,索引为2) field_value = cells[2].get_text(strip=True) record_data[field_name] = field_value
步骤2:转成结构化DataFrame
把整理好的字典转成DataFrame即可,如果是单条记录,记得把字典放到列表里:
df = pd.DataFrame([record_data])
处理多条记录的情况
如果页面里有749条这类记录(对应示例里的"Record : 1 of 749"),你可以循环处理每个记录对应的表格,把每个记录的字典都加到列表里,最后统一转成DataFrame:
all_records = [] # 假设你能定位到所有记录的表格(比如用soup.find_all('table')) for table in soup.find_all('table'): rows = table.find_all('tr') record_data = {} for row in rows[1:]: cells = row.find_all('td') if len(cells) >=3: field_name = cells[0].get_text(strip=True) field_value = cells[2].get_text(strip=True) record_data[field_name] = field_value # 确保字典不为空再加入列表 if record_data: all_records.append(record_data) df = pd.DataFrame(all_records)
小提示
- 如果遇到结构特殊的行(比如缺少冒号单元格),可以加额外的判断逻辑跳过或灵活处理
get_text(strip=True)能帮你去掉文本前后的空格和换行,让数据更干净
内容的提问来源于stack exchange,提问作者O. Snow
相关产品推荐
相关产品推荐

