如何从不同长度的HTML表格中精准抓取指定字段?
解决HTML表格表头与行长度不一致的字段抓取问题
核心思路是先建立目标表头字段和对应列位置的映射,不管每行的单元格数量多少,都严格按照表头的位置去提取内容,避免因列数不匹配导致的错位。
修正后的脚本示例
from bs4 import BeautifulSoup def extract_table_fields(html_content, target_fields): soup = BeautifulSoup(html_content, 'html.parser') table = soup.find('table') if not table: return [] # 解析表头,构建字段到列索引的映射 header_row = table.find('tr') headers = [th.get_text(strip=True) for th in header_row.find_all('th')] # 只保留需要的字段对应的索引 field_index_map = {field: idx for idx, field in enumerate(headers) if field in target_fields} # 遍历数据行提取内容 extracted_data = [] for row in table.find_all('tr')[1:]: # 跳过表头行 cells = [td.get_text(strip=True) for td in row.find_all('td')] row_data = {} for field, idx in field_index_map.items(): # 处理行单元格数量不足的情况,避免索引越界 row_data[field] = cells[idx] if idx < len(cells) else '' extracted_data.append(row_data) return extracted_data # 模拟你提到的html_table1测试 html_table1 = """ <table> <tr> <th>姓名</th> <th>年龄</th> <th>城市</th> </tr> <tr> <td>张三</td> <td>25</td> </tr> <tr> <td>李四</td> <td>30</td> <td>北京</td> <td>额外信息</td> </tr> </table> """ # 指定要抓取的字段 targets = ['姓名', '年龄', '城市'] result = extract_table_fields(html_table1, targets) print(result)
关键说明
- 先解析表头生成字段-索引映射,只保留你需要的字段,过滤无关表头
- 遍历每行时,先获取所有单元格内容,再根据映射的索引提取对应内容
- 加入索引越界判断:如果当前行的单元格数量小于目标索引,就返回空字符串,避免报错或错位
运行示例代码后,输出结果会精准对应字段:
[{'姓名': '张三', '年龄': '25', '城市': ''}, {'姓名': '李四', '年龄': '30', '城市': '北京'}]
内容的提问来源于stack exchange,提问作者MITHU
相关产品推荐
相关产品推荐

