Python正则匹配后无法提取JSON数据 仅返回SRE_Match对象求解
问题原因
你当前代码返回<_sre.SRE_Match object at 0x7f3b92110988>是两个问题导致的:
re.search()匹配成功时默认返回匹配对象实例,而非匹配到的具体文本,要获取匹配内容需要调用该对象的.group()方法。- 你写的正则仅匹配了
Total Cash Dividends Paid这串固定文本,没有覆盖该字段对应的日期、数值数据段,就算调用.group()也只能拿到字段名本身,拿不到后面的结构化数据。
可行解决方案
直接解析fusion-metadata标签内的结构化JSON数据,比纯正则匹配稳定性更高,完整可运行代码如下:
import requests import json from lxml import html headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) ' 'AppleWebKit/601.3.9 (KHTML, like Gecko) Version/9.0.2 Safari/601.3.9' } # 请求目标页面 resp = requests.get( 'https://www.reuters.com/markets/companies/ASJT.JK/financials/income-annual', headers=headers ) tree = html.fromstring(resp.content) # 提取fusion-metadata内的JSON文本 metadata_text = tree.xpath('//*[@id="fusion-metadata"]/text()')[0] # 解析为Python字典 metadata = json.loads(metadata_text) annual_data = [] interim_data = [] # 遍历财务指标节点,定位目标字段 for section in metadata['fusion']['components']['root']['children']: section_props = section.get('props', {}) if 'financials' in section_props.get('data', {}): fin_data = section_props['data']['financials'] # 匹配Total Cash Dividends Paid指标 for metric in fin_data['income']: if metric.get('label') == 'Total Cash Dividends Paid': # 提取年度数据 for point in metric.get('annual', []): annual_data.append({ "date": point['date'], "value": f"{point['value']:.6f}" }) # 提取季度/中期数据 for point in metric.get('interim', []): interim_data.append({ "date": point['date'], "value": f"{point['value']:.6f}" }) break # 输出结果 print(annual_data) print(interim_data)
方案原理
- 路透社该财务页面的所有报表数据都预加载在id为
fusion-metadata的脚本标签中,存储格式为标准JSON,不需要通过正则逐段抠取文本,直接用json.loads()反序列化为Python字典后按数据层级取值即可,抗页面结构变动的能力远强于纯正则方案。 - 目标字段
Total Cash Dividends Paid对应的年度、季度/中期数据分别存储在该指标节点的annual和interim键下,每个数据点都自带标准化的date(日期)和value(数值)字段,直接遍历取值后按要求格式化浮点数到6位小数,就能得到你预期的输出结构。 - 该方案不需要写复杂的长正则匹配规则,后续如果要提取其他财务指标,只需要修改判断
label的条件即可,扩展成本很低。
内容的提问来源于stack exchange,提问作者behappy
相关产品推荐
相关产品推荐

