使用pd.read_html提取维基百科多表格数据并导出CSV的问题
问题解决:提取维基百科17th Lok Sabha所有表格并导出CSV
问题背景
需要从指定维基百科页面提取所有表格数据,转为Pandas DataFrame并导出为CSV。当前仅能提取第一个表格,尝试合并所有表格时出现VisibleDeprecationWarning警告,输出格式异常,单独处理每个表格效率低下。
错误原因
原代码中,将所有BeautifulSoup提取的表格转为字符串列表后,用pd.read_html得到的是多个DataFrame组成的列表,直接将这个列表传入pd.DataFrame()会把每个DataFrame当作单个元素存入一行,由于各DataFrame的行数/列数不一致,导致生成“不规则嵌套序列”,触发警告且输出格式混乱。
解决方案
方法一:直接用pd.read_html读取目标页面(最简洁高效)
pd.read_html支持直接传入URL,并通过attrs参数筛选目标表格,无需额外使用BeautifulSoup处理页面:
import pandas as pd # 直接读取页面中所有符合class的表格,返回DataFrame列表 wiki_url = 'https://en.wikipedia.org/wiki/List_of_members_of_the_17th_Lok_Sabha' dfs = pd.read_html(wiki_url, attrs={'class': 'wikitable sortable'}) # 合并所有结构一致的DataFrame combined_df = pd.concat(dfs, ignore_index=True) # 导出为CSV combined_df.to_csv('India 17th Lok Sabha.csv', index=False)
方法二:配合BeautifulSoup逐个处理表格(适合复杂页面筛选)
如果需要用BeautifulSoup做更精细的表格筛选,需逐个读取每个表格的HTML字符串,转为DataFrame后合并:
import pandas as pd import requests from bs4 import BeautifulSoup wiki_url = 'https://en.wikipedia.org/wiki/List_of_members_of_the_17th_Lok_Sabha' page = requests.get(wiki_url) soup = BeautifulSoup(page.text, 'html.parser') tables = soup.find_all('table', {'class': 'wikitable sortable'}) # 逐个处理每个表格,生成DataFrame列表 dfs = [] for table in tables: # 读取单个表格的HTML字符串,得到包含一个DataFrame的列表,取第一个元素 df = pd.read_html(str(table))[0] dfs.append(df) # 合并所有DataFrame combined_df = pd.concat(dfs, ignore_index=True) # 导出CSV combined_df.to_csv('India 17th Lok Sabha.csv', index=False)
关键说明
pd.concat(dfs, ignore_index=True):将所有结构一致的DataFrame按行合并,ignore_index=True重置合并后的索引,避免索引重复。- 如果部分表格列名/结构不一致,可先检查每个DataFrame的列,对列名做统一处理后再合并(比如重命名列、补充缺失列等)。
内容的提问来源于stack exchange,提问作者edgestorm517
相关产品推荐
相关产品推荐

