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

爬取Yahoo Finance财务数据后,如何拆分连串带逗号的数值?

拆分Yahoo Finance财务数据中的连缀数值问题

我用BeautifulSoup爬取Yahoo Finance的财务数据(目标页面为NUE的财务报表),想把HTML里的财务数据提取并存入数组,但现在得到的输出是连在一起的数值,比如Total Revenue42,965,39136,483,93920,139,65822,588,85825,067,279,需要把这类连缀的数值拆分(比如把42,965,39136,483,939拆成42,965,391和36,483,939),尝试用正则表达式但没成功,我的代码如下:

with open('Nucor Yahoo HTML.html','r') as html:
content = html.read()
soup = BeautifulSoup(content, 'lxml')
tables = soup.find_all(class_ = 'rw-expnded')
for table in tables:
    pattern = re.compile(r'\d\d\d?,[0-9]{3},[0-9]{3}')
    matches = pattern.finditer(table.text)
    for match in matches:
        print(match)
    print(table.text)

解决方案

你之前的正则表达式问题在于它是固定长度匹配,只能匹配xxx,xxx,xxx这类格式,但无法适配xx,xxx,xxx(比如25,067,279)的数值,更处理不了连缀在一起的数值。可以用更灵活的正则来匹配所有带千分位分隔符的数值:

改进后的代码

import re
from bs4 import BeautifulSoup

with open('Nucor Yahoo HTML.html','r') as html:
    content = html.read()
soup = BeautifulSoup(content, 'lxml')
tables = soup.find_all(class_='rw-expnded')

for table in tables:
    # 匹配所有带千分位分隔符的数值:1-3位数字 + 任意次数(逗号+3位数字)
    num_pattern = re.compile(r'\d{1,3}(?:,\d{3})+')
    # 提取所有匹配到的数值,自动拆分连缀项
    numbers = num_pattern.findall(table.text)
    # 提取项目名称(比如"Total Revenue")
    name_pattern = re.compile(r'^[A-Za-z\s]+')
    item_name = name_pattern.match(table.text).group().strip()
    
    print(f"{item_name}:")
    print(numbers)
    # 若要存入数组,直接使用numbers列表即可

关键说明

  • 正则\d{1,3}(?:,\d{3})+的逻辑:
    • \d{1,3}:匹配开头的1-3位数字(覆盖千分位前的1-3位,比如42、36、20)
    • (?:,\d{3})+:非捕获组,匹配1次或多次“逗号+3位数字”的组合(覆盖千分位部分,比如,965,391、,483,939)
  • findall会直接返回所有符合规则的数值列表,自动把连缀的数值拆分成独立项。

内容的提问来源于stack exchange,提问作者Michael

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 00:50:28