爬取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
相关产品推荐
相关产品推荐

