使用BeautifulSoup提取财务数据后转DataFrame失败,求处理方案
从无分隔连续文本提取财务数据并转换为DataFrame
pd.read_csv只适用于有明确分隔符的结构化文本,你的无分隔连续文本肯定用不了,得用正则表达式来匹配提取关键信息,下面是具体操作步骤:
1. 先明确文本的结构规律
先把你的str_data拿出来拆解,比如假设它的格式类似:
2023-2024营业收入123456.78净利润98765.43总资产567890.122022-2023营业收入111222.33净利润88877.66总资产444555.99
核心规律一般是:
- 会计年度:
XXXX-XXXX格式的字符串 - 财务指标:固定关键词(比如营业收入、净利润、总资产等)
- 数值:紧跟在指标后的数字(可能带小数点、千分位逗号)
2. 用正则表达式批量提取数据
根据上面的规律写正则匹配规则,把年度、指标、数值一一对应提取出来:
import re import pandas as pd # 替换成你实际的str_data内容 str_data = "2023-2024营业收入123456.78净利润98765.43总资产567890.122022-2023营业收入111222.33净利润88877.66总资产444555.99" # 正则规则:先匹配年度,再匹配该年度下的所有指标+数值 pattern = re.compile(r'(\d{4}-\d{4})((?:营业收入|净利润|总资产)[\d,.]+)+') # 提取所有年度对应的指标块 matches = pattern.findall(str_data) # 整理成结构化数据 data_list = [] for year, metrics_block in matches: # 拆分单个年度下的每个指标和数值 metric_pattern = re.compile(r'(营业收入|净利润|总资产)([\d,.]+)') metric_matches = metric_pattern.findall(metrics_block) row = {'会计年度': year} for metric, value in metric_matches: # 去掉数值里的千分位逗号,转成数值类型 row[metric] = float(value.replace(',', '')) data_list.append(row) # 转换为DataFrame df = pd.DataFrame(data_list) print(df)
3. 适配你的实际文本调整规则
如果你的str_data有特殊格式,只需修改正则部分:
- 若指标有新增(比如“营业成本”“净资产收益率”),把
(营业收入|净利润|总资产)改成(营业收入|净利润|总资产|营业成本|净资产收益率) - 若数值带负号,把
([\d,.]+)改成([-+]?[\d,.]+) - 若数值带货币符号(比如₹),把
([\d,.]+)改成(₹?[\d,.]+),处理时再去掉符号
4. 最终效果
运行代码后会得到结构化的DataFrame,示例输出:
| 会计年度 | 营业收入 | 净利润 | 总资产 |
|---|---|---|---|
| 2023-2024 | 123456.78 | 98765.43 | 567890.12 |
| 2022-2023 | 111222.33 | 88877.66 | 444555.99 |
直接用这个DataFrame就能做后续财务计算了。
内容的提问来源于stack exchange,提问作者Abinash Tripathy
相关产品推荐
相关产品推荐

