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

无法从网页表格生成DataFrame,寻求技术排查帮助

问题诊断与修复方案

核心问题分析

  • 错误的tbody查找逻辑:table_attribs是你定义的列名映射(原表头到DataFrame列名),但你用它作为find_all('tbody', attrs=...)的属性参数,tbody标签根本没有Bank name或Market Cap (US$ Billion)这类属性,导致table_bodies是空列表,后续循环完全不执行,最终生成空DataFrame。
  • 变量定义被注释干扰:extracted_data = []和注释挤在同一行,既影响可读性,也可能引发语法解析问题。
  • 无差别提取单元格:原代码提取所有td单元格,但目标表格第一列是排名,你只需要银行名和市值两列,无差别提取会引入冗余数据。

修正后的代码

import requests
import pandas as pd
from bs4 import BeautifulSoup

url = 'https://en.wikipedia.org/wiki/List_of_largest_banks#By_market_capitalization'
table_attribs = {'Bank name': 'Name', 'Market Cap (US$ Billion)': 'MC_USD_Billion'}

def extract(url, table_attribs):
    # 获取网页内容
    html_page = requests.get(url).text
    data = BeautifulSoup(html_page, 'html.parser')
    
    # 定位目标表格
    main_table = data.find('table', class_='wikitable sortable')
    if not main_table:
        return None
    
    # 获取表格主体(维基百科这类表格通常只有一个tbody)
    tbody = main_table.find('tbody')
    if not tbody:
        return None
    
    extracted_data = []
    # 跳过表头行,遍历数据行
    rows = tbody.find_all('tr')[1:]
    for row in rows:
        cells = row.find_all('td')
        if len(cells) >= 3:
            # 提取目标列并清理文本冗余
            bank_name = cells[1].text.strip()
            market_cap = cells[2].text.strip()
            extracted_data.append([bank_name, market_cap])
    
    # 生成DataFrame
    df = pd.DataFrame(extracted_data, columns=list(table_attribs.values()))
    return df

# 执行提取并输出结果
df = extract(url, table_attribs)
if df is not None and not df.empty:
    print(df)
else:
    print("提取失败,未获取到有效数据。")

关键修复说明

  1. 修正元素定位逻辑:直接获取表格下的唯一tbody,无需用find_all遍历。
  2. 跳过表头行:表格第一行是表头,从索引1开始遍历数据行,避免把表头混入数据。
  3. 精准提取目标列:明确提取第二列(银行名)和第三列(市值),用strip()清理文本中的换行、空格等无效字符。
  4. 增加异常判断:找不到表格或tbody时返回None,输出时检查DataFrame是否为空,避免报错。

内容的提问来源于stack exchange,提问作者Olabimpe Ladipo-Afolabi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 14:13:35