BeautifulSoup提取拍卖表格数据异常及缺失数据适配需求
问题修复:拍卖表格数据提取与DataFrame生成适配
问题背景
原parseForclosure函数曾正常提取网页中class为ad_tab的拍卖表格数据并转换为DataFrame,但目前出现表格匹配数量为0的问题,同时无法适配存在缺失数据的样本文件,导致生成的DataFrame结构不一致。
原代码核心问题
- 表格匹配逻辑脆弱:仅通过
attrs={'class':'ad_tab'}查找,若页面中class名存在大小写差异、多class组合等情况,会直接匹配失败 - 数据收集逻辑混乱:全局
data变量在多表格场景下会累积数据,且直接按固定索引取值,一旦数据缺失会触发索引错误 - 缺失字段未处理:未针对缺失数据的样本做字段补全,导致不同样本生成的DataFrame结构不一致
- 拼接方式低效:使用已被弃用的
append方法拼接DataFrame,性能较差
修复后的完整代码
import pandas as pd from bs4 import BeautifulSoup def parseForclosure(pagesource): soup = BeautifulSoup(pagesource, 'html.parser') # 用CSS选择器匹配class包含ad_tab的表格,兼容多class/大小写场景 tables = soup.select('table.ad_tab') df_collection = [] for table in tables: record = {} # 遍历表格内所有行,关联表头与数据 for row in table.find_all('tr'): label = row.find('th', class_='AD_LBL') value = row.find('td', class_='AD_DTA') if not label or not value: continue label_text = label.text.strip() value_text = value.text.strip() # 映射表头文本到DataFrame列名 if label_text == 'Auction Type:': record['AuctionType'] = value_text elif label_text in ('Case #:', 'Case Number'): record['CaseNo'] = value_text elif label_text == 'Final Judgment Amount:': record['FinalJudgmentAmount'] = value_text elif label_text == 'Parcel ID:': record['ParcelID'] = value_text elif label_text == 'Property Address:': # 处理地址分两行展示的情况 record['PropertyAddress1'] = record.get('PropertyAddress1', value_text) elif not label_text: # 空表头对应地址第二行 record['PropertyAddress2'] = value_text elif label_text == 'Assessed Value:': record['AssessedValue'] = value_text elif label_text == 'Plaintiff Max Bid:': record['PlaintiffMaxBid'] = value_text # 确保所有必填列存在,缺失字段填充None required_columns = [ 'AuctionType', 'CaseNo', 'FinalJudgmentAmount', 'ParcelID', 'PropertyAddress1', 'PropertyAddress2', 'AssessedValue', 'PlaintiffMaxBid' ] for col in required_columns: if col not in record: record[col] = None df_collection.append(pd.DataFrame([record])) # 合并所有表格数据,生成统一结构的DataFrame return pd.concat(df_collection, ignore_index=True)
关键修复点说明
- 健壮的表格匹配:使用CSS选择器
table.ad_tab,能匹配class属性中包含ad_tab的表格,兼容页面中class名的大小写、多class组合等场景 - 基于表头的映射:通过
<th>标签的文本内容匹配字段,避免依赖固定索引,适配数据行顺序变化的情况 - 特殊字段处理:针对地址分两行展示的场景做专门适配,自动识别地址的第一行和第二行
- 缺失字段补全:强制检查所有必填列,缺失的字段自动填充
None,确保无论样本是否缺失数据,生成的DataFrame结构完全一致 - 高效数据拼接:使用
pd.concat替代append,符合pandas的最佳实践,提升数据拼接性能
内容的提问来源于stack exchange,提问作者Leo Torres
相关产品推荐
相关产品推荐

