无法从网页表格生成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("提取失败,未获取到有效数据。")
关键修复说明
- 修正元素定位逻辑:直接获取表格下的唯一tbody,无需用
find_all遍历。 - 跳过表头行:表格第一行是表头,从索引1开始遍历数据行,避免把表头混入数据。
- 精准提取目标列:明确提取第二列(银行名)和第三列(市值),用
strip()清理文本中的换行、空格等无效字符。 - 增加异常判断:找不到表格或tbody时返回None,输出时检查DataFrame是否为空,避免报错。
内容的提问来源于stack exchange,提问作者Olabimpe Ladipo-Afolabi
相关产品推荐
相关产品推荐

