支持3种类型的数据提取:1. 通过jsonpath从response.json()提取数据; 2. 通过正则表达式从response.text提取; 3. 直接从response提取cookies之类;
72 lines
2.7 KiB
Python
72 lines
2.7 KiB
Python
# -*- coding: utf-8 -*-
|
||
# @Time : 2023/6/28 14:35
|
||
# @Author : chenyinhua
|
||
# @File : extract_data_handle.py
|
||
# @Software: PyCharm
|
||
# @Desc: 提取数据的一些方法
|
||
|
||
# 标准库导入
|
||
import re
|
||
# 第三方库导入
|
||
from jsonpath import jsonpath
|
||
from loguru import logger
|
||
from requests import Response
|
||
|
||
|
||
def json_extractor(obj: dict, expr: str = '.'):
|
||
"""
|
||
从目标对象obj, 根据表达式expr提取指定的值
|
||
:param obj :json/dict类型数据
|
||
:param expr: 表达式, . 提取字典所有内容, $.test_api_case 提取一级字典case, $.test_api_case.data 提取case字典下的data
|
||
:return result: 提取的结果,未提取到返回 None
|
||
"""
|
||
try:
|
||
result = jsonpath(obj, expr)[0] if len(jsonpath(obj, expr)) == 1 else jsonpath(obj, expr)
|
||
logger.trace(f"\n提取表达式: {expr} \n"
|
||
f"提取值类型: {type(result)}\n"
|
||
f"提取值:{result}\n")
|
||
return result
|
||
except Exception as e:
|
||
logger.trace(f"\n提取表达式: {expr}\n"
|
||
f"提取对象: {obj}\n"
|
||
f"错误信息:{e}\n")
|
||
|
||
|
||
def re_extract(obj: str, expr: str = '.'):
|
||
"""
|
||
从目标对象obj, 根据表达式expr提取指定的值
|
||
:param obj : 字符串数据
|
||
:param expr: 正则表达式
|
||
:return result: 提取的结果,未提取到返回 None
|
||
"""
|
||
try:
|
||
# 如果提取后的数据长度为1,则取第一个元素(返回str),否则返回列表
|
||
result = re.findall(expr, obj)[0] if len(re.findall(expr, obj)) == 1 else re.findall(expr, obj)
|
||
logger.debug(f"\n提取表达式: {expr}\n"
|
||
f"提取值类型: {type(result)}\n"
|
||
f"提取值:{result}\n")
|
||
return result
|
||
except Exception as e:
|
||
logger.debug(f"\n提取表达式: {expr}\n"
|
||
f"提取对象: {obj}\n"
|
||
f"错误信息:{e}\n")
|
||
|
||
|
||
def response_extract(response: Response, expr: str = '.'):
|
||
"""
|
||
从response响应对象提取cookies之类
|
||
:param response : response对象
|
||
:param expr: 提取表达式。部分参考:response.status_code, response.cookies, response.text, response.headers, response.is_redirect
|
||
:return result: 提取的结果,未提取到返回 None
|
||
"""
|
||
try:
|
||
result = eval(expr)
|
||
logger.debug(f"\n提取表达式: {expr}\n"
|
||
f"提取值类型: {type(result)}\n"
|
||
f"提取值:{result}\n")
|
||
return result
|
||
except Exception as e:
|
||
logger.debug(f"\n提取表达式: {expr}\n"
|
||
f"提取对象: {response}\n"
|
||
f"错误信息:{e}\n")
|