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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 12:27:38