从python中的文本提取JSON

时间:2018-07-01 14:55:06

标签: python regex python-3.x

我想从日志文本中提取JSON /字典。

示例日志文本:

2018-06-21 19:42:58 [scrapy.crawler]信息:覆盖的设置:{'BOT_NAME':'位置','CLOSESPIDER_TIMEOUT':'14400','FEED_FORMAT':'geojson','LOG_FILE ':'/geojson_dumps/21_Jun_2018_07_42_54/logs/coastalfarm.log','LOG_LEVEL':'INFO','NEWSPIDER_MODULE':'locations.spiders','SPIDER_MODULES':['locations.spiders'],'TELNETCONSOLE_ENABLE 0','USER_AGENT':'Mozilla / 5.0'}

2018-06-21 19:43:00 [scrapy.statscollectors]信息:倾销Scrapy统计信息: {'downloader / request_bytes':369,  'downloader / request_count':1,  “ downloader / request_method_count / GET”:1,  'downloader / response_bytes':1718,  “ downloader / response_count”:1,  'downloader / response_status_count / 200':1,  'finish_reason':'完成',  'finish_time':datetime.datetime(2018,6,21,14,13,13,0,841666),  'item_scraped_count':4,  'log_count / INFO':8,  'memusage / max':56856576,  '娱乐/启动':56856576,  'response_received_count':1  “计划程序/出队”:1  “调度程序/出队/内存”:1  “调度程序/排队”:1  “计划程序/排队/内存”:1  'start_time':datetime.datetime(2018、6、21、14、12、58、499385)}

2018-06-21 19:43:00 [scrapy.core.engine]信息:蜘蛛关闭(完成)

我已经尝试将(\{.+$\})作为正则表达式来使用,但是它给了我单行的字典,{'BOT_NAME': 'locations',..., 'USER_AGENT': 'Mozilla/5.0'}并不是期望的。

我要提取的json /字典: 注意:字典中的键不同,可能会有所不同。

{'downloader/request_bytes': 369, 'downloader/request_count': 1, 'downloader/request_method_count/GET': 1, 'downloader/response_bytes': 1718, 'downloader/response_count': 1, 'downloader/response_status_count/200': 1, 'finish_reason': 'finished', 'finish_time': datetime.datetime(2018, 6, 21, 14, 13, 0, 841666), 'item_scraped_count': 4, 'log_count/INFO': 8, 'memusage/max': 56856576, 'memusage/startup': 56856576, 'response_received_count': 1, 'scheduler/dequeued': 1, 'scheduler/dequeued/memory': 1, 'scheduler/enqueued': 1, 'scheduler/enqueued/memory': 1, 'start_time': datetime.datetime(2018, 6, 21, 14, 12, 58, 499385)}

1 个答案:

答案 0 :(得分:1)

编辑:JSON跨越多行,因此将执行以下操作:

import re

re_str = '\d{2}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} \[scrapy\.statscollectors] INFO: Dumping Scrapy stats:.({.+?\})'
stats_re = re.compile(re_str, re.MULTILINE | re.DOTALL)

for match in stats_re.findall(log):
    print(match)

如果您只关注statscollector中的各行,那么这应该可以带您到达那里(假设它们也都在同一行上):

^.*?\[scrapy.statscollectors] INFO: Dumping Scrapy stats: (\{.+$\}).*?$