BeautifulSoup模板简单应用-提取html指定数据(api_nameapi_methodapi_path,请求body请求headerpagam参数)

BeautifulSoup模板简单应用-提取html指定数据(api_nameapi_methodapi_path,请求body请求headerpagam参数),第1张

概述from bs4 import BeautifulSoupimport reimport os.pathimport itertoolsname=‘newcrm‘source_file_path=‘./‘+name+‘.html‘def get_apiInfo(): with open(source_file_path,encoding=‘utf-8‘)
from bs4 import BeautifulSoupimport reimport os.pathimport itertoolsname=newcrmsource_file_path=./+name+.HTMLdef get_APIInfo():    with open(source_file_path,enCoding=utf-8) as API_file:        fileInfo=API_file.read()        soup = BeautifulSoup(fileInfo,lxml)  #这里没有装lxml的话,把它去掉用默认的就好        #匹配带有class属性的div标签        divList = soup.find_all(div,attrs={class: re.compile("API-one")})        # print(len(divList))        APIInfo_List=[]#存放所有的API_List        try:            for alltag in divList:                h3List=alltag.find_all(h3)#在每个div标签下,查找所有的h3标签(包含接口名称)                pList = alltag.find_all(p)  #在每个div标签下,查找所有的p标签(包含请求url与请求方法)                tableList=alltag.find_all("table")#匹配div下所有线程的table标签(取出header字段/body字段)                dictInfo={}                API_descrIDe_name_List,API_descrIDe_example_List,API_descrIDe_type_List=[],[],[]                ‘‘‘所有的接口描述信息:名称/描述/类型‘‘‘                query_Param_name_List,query_Param_type_List,query_Param_IsNeed_List=[],[]                query_Param_describe_List,query_Param_example_List=[],[]                ‘‘‘所有的query参数信息:名称/类型/是否必填/描述,主要用于get请求‘‘‘                body_Param_name_List,body_Param_type_List,body_Param_IsNeed_List=[],[]                body_Param_describe_List,body_Param_example_List=[],[]                ‘‘‘所有的body参数信息:名称/类型/是否必填/描述,主要用于post/put/delete请求‘‘‘                header_Param_name_List,header_Param_type_List,header_Param_IsNeed_List=[],[]                header_Param_describe_List,header_Param_example_List=[],[]                ‘‘‘所有的header参数信息:名称/类型/是否必填/描述‘‘‘                # if divList.index(alltag)==len(divList):                if not len(pList)<3:#如果请求方式/请求url为空则不执行后面的程序                    API_name=h3List[0].string.strip()#匹配h3标签下的接口名称                    API_method=pList[1].string.strip()#这里提取请求方式                    API_path=pList[2].string.strip() #这里提取url,并去除空格                    dictInfo[API_name]=API_name                    dictInfo[API_method]=API_method                    dictInfo[API_path]=API_path                    header_List=[]#存放header值                    body_List=[]#存放body值                    query_List=[]#存放query值                    API_descrIDe_List=[]#存放所有接口描述信息                    # print(API_name)                    # print(API_method)                       # print(API_path)                      IsEmpty_str=Null_Str#处理匹配为空时的字符串占位符                    if not tableList in([],None):                        for table in tableList:                            table_Title=table.tr.th.span.string#匹配table表头                            table_thead=table.find_all(thead)#匹配table里的所有thead标签:字段Title(描述)                            table_tbody=table.find_all(tbody)#匹配字段value                                                        tbody_temp_List1,tbody_temp_List2=[],[]#临时存放接口描述数据                            for tbody in table_tbody:                                tbody_key_type=tbody.find_all(th)#匹配出字段的类型                                tbody_key_fIEld=tbody.find_all(td)#匹配出字段的value                                for tbody_name in tbody_key_fIEld :#取出所有字段                                    if not tbody_name.string is None:                                        tbody_key=tbody_name.string.strip()                                    else:                                        tbody_name=IsEmpty_str#处理为空的情况                                        tbody_key=tbody_name                                        #将能够被5整除的字段放入body中(代表的是header/body)                                    # print(tbody_name)                                    if len(tbody_key_fIEld)%5==0:                                        if table_Title in(query参数名):                                            ‘‘‘如果table的名称是query,则添加到query列表中‘‘‘                                            query_List.append(tbody_key)                                        elif table_Title in(Body参数名):                                            ‘‘‘如果table的名称是body,则添加到body列表中‘‘‘                                            body_List.append(tbody_key)                                        elif table_Title in(header参数名):                                            ‘‘‘如果table的名称是header,则添加到header列表中‘‘‘                                            header_List.append(tbody_key)#将能够被5整除的字段放入body中(代表的是header/body)                                    elif len(tbody_key_fIEld)%2==0 and table_Title ==(参数名):                                        tbody_temp_List1.append(tbody_key)#剩下的放入参数名信息中,代表的是参数名描述                                # print(header_List)                                # print(body_List)                                # print(tbody_temp_List1)                                if not tbody_key_type==[]:                                    for tbody_type in tbody_key_type:                                        if type(tbody_type)!=(str,int):#只处理type为tag的                                                                                     if not (tbody_type.string is None) :                                                tbody_fIEld=tbody_type.string.strip()                                                tbody_temp_List2.append(tbody_fIEld)                                            else:                                                tbody_type=IsEmpty_str#处理为空的情况                                                tbody_temp_List2.append(tbody_type)                                    # print(tbody_temp_List2)                                    temp_num=int(len(tbody_temp_List1)/len(tbody_temp_List2))                                    #计算出两个List的对应关系,这里是2:1,                                    #需要添加tbody_temp_List1key添加两次后在添加tbody_temp_List2的值                                    for temp_tuple in enumerate(tbody_temp_List2):                                        #将tbody_temp_List1/tbody_temp_List2的元素添加至API_descrIDe_List                                        #‘‘‘temp_tuple:是一个元组,第一个参数是index,第二个是value‘‘‘                                        for num in range(temp_num):                                        #因为tbody_temp_List1/tbody_temp_List2是多对1,                                        #因为接口描述里的type是单独的th标签里的值,                                        #而其他的值是td标签里面的值,所以需要将两个列表的元素进行合并                                            API_descrIDe_List.append(tbody_temp_List1[temp_tuple[0]*(temp_num)+num])                                        else:                                            API_descrIDe_List.append(temp_tuple[1])                                    # print(header_List)                                    # print(body_List)                                    # print(API_descrIDe_List)                                    #                     if not header_List in([],None):#处理header列表中字段为空的情况                        for n,m in enumerate(header_List):                        #删除filed(不存在)的相关元素,这个是APIzza导出的BUG导致的                        #因为列表存在多个相同的值,所以不能使用index方法来获取元素下标,                        #使用enumerate来获取List的值与对应的下标                            if m in("","") :#根据m的值找到对应的下表n                                try:                                    if header_List[(n+3)]==IsEmpty_str:                                #如果n后面的第三个元素不是一个字段,而是事先定义的为空的字符串,则删除索引后面的五个元素                                        for i in range(5):                                            del header_List[n+3]                                except IndexError as error:                                    pass                        for header_data in enumerate(header_List):#将列表中的值分别添加至各个列表                            if header_data[0]==0 or header_data[0]%5==0 :                                header_Param_name_List.append(header_data[1])                            elif header_data[0]==1 or header_data[0]%5==1 :                                header_Param_type_List.append(header_data[1])                            elif header_data[0]==2 or header_data[0]%5==2:                                header_Param_IsNeed_List.append(header_data[1])                            elif header_data[0]==3 or header_data[0]%5==3:                                header_Param_describe_List.append(header_data[1])                            elif header_data[0]==4 or header_data[0]%5==4:                                header_Param_example_List.append(header_data[1])                    if not query_List in([],None):                        for n,m in enumerate(query_List):#处理query列表中字段为空的情况                        #因为列表可能存在多个相同的值,所以不能使用index方法来获取元素下标,                        #使用enumerate来获取List的值与对应的下标                            if m in("","") :#根据m的值找到对应的下表n                                try:                                    if query_List[(n+3)]==IsEmpty_str:                                #如果n后面的第三个元素不是一个字段,而是事先定义的为空的字符串,                                #则删除索引后面的五个元素                                        for i in range(5):                                            del query_List[n+3]                                except IndexError as error:                                    pass                        for query_data in enumerate(query_List):#将列表中的值分别添加至各个列表                            if query_data[0]==0 or query_data[0]%5==0 :                                query_Param_name_List.append(query_data[1])                            elif query_data[0]==1 or query_data[0]%5==1 :                                query_Param_type_List.append(query_data[1])                            elif query_data[0]==2 or query_data[0]%5==2:                                query_Param_IsNeed_List.append(query_data[1])                            elif query_data[0]==3 or query_data[0]%5==3:                                query_Param_describe_List.append(query_data[1])                            elif query_data[0]==4 or query_data[0]%5==4:                                query_Param_example_List.append(query_data[1])                    if not body_List in([],m in enumerate(body_List):#处理body列表中字段为空的情况                        #因为列表可能存在多个相同的值,所以不能使用index方法来获取元素下标,                        #使用enumerate来获取List的值与对应的下标                            if m in("","") :#根据m的值找到对应的下表n                                try:                                    if body_List[(n+3)]==IsEmpty_str:                                #如果n后面的第三个元素不是一个字段,而是事先定义的为空的字符串,                                #则删除索引后面的五个元素                                        for i in range(5):                                            del body_List[n+3]                                except IndexError as error:                                    pass                        for body_data in enumerate(body_List):#将列表中的值分别添加至各个列表                            if body_data[0]==0 or body_data[0]%5==0 :                                body_Param_name_List.append(body_data[1])                            elif body_data[0]==1 or body_data[0]%5==1 :                                body_Param_type_List.append(body_data[1])                            elif body_data[0]==2 or body_data[0]%5==2:                                body_Param_IsNeed_List.append(body_data[1])                            elif body_data[0]==3 or body_data[0]%5==3:                                body_Param_describe_List.append(body_data[1])                            elif body_data[0]==4 or body_data[0]%5==4:                                body_Param_example_List.append(body_data[1])                                                if not API_descrIDe_List in([],None):#处理header列表中字段为空的情况                        for API_descrIDe_data in enumerate(API_descrIDe_List):#将列表中的值分别添加至各个列表                            if API_descrIDe_data[0]==0 or API_descrIDe_data[0]%3==0 :                                API_descrIDe_name_List.append(API_descrIDe_data[1])                            elif API_descrIDe_data[0]==1 or API_descrIDe_data[0]%3==1 :                                API_descrIDe_example_List.append(API_descrIDe_data[1])                            elif API_descrIDe_data[0]==2 or API_descrIDe_data[0]%3==2:                                API_descrIDe_type_List.append(API_descrIDe_data[1])                                        if not header_List in(None,[]):                        dictInfo[header]={}                        dictInfo[header][参数名]=header_Param_name_List                        dictInfo[header][类型]=header_Param_type_List                        dictInfo[header][必需]=header_Param_IsNeed_List                        dictInfo[header][描述]=header_Param_describe_List                        dictInfo[header][示例]=header_Param_example_List                    if not query_List in(None,[]):                        dictInfo[query]={}                        dictInfo[query][参数名]=query_Param_name_List                        dictInfo[query][类型]=query_Param_type_List                        dictInfo[query][必需]=query_Param_IsNeed_List                        dictInfo[query][描述]=query_Param_describe_List                        dictInfo[query][示例]=query_Param_example_List                    if not body_List in(None,[]):                        dictInfo[Body]={}                        dictInfo[Body][参数名]=body_Param_name_List                        dictInfo[Body][类型]=body_Param_type_List                        dictInfo[Body][必需]=body_Param_IsNeed_List                        dictInfo[Body][描述]=body_Param_describe_List                        dictInfo[Body][示例]=body_Param_example_List                    if not API_descrIDe_List in(None,[]):                        dictInfo[接口说明]={}                        dictInfo[接口说明][参数名]=API_descrIDe_name_List                        dictInfo[接口说明][描述]=API_descrIDe_example_List                        dictInfo[接口说明][类型]=API_descrIDe_type_List                    # dictInfo[‘header_List‘]=header_List                    # dictInfo[‘body_List‘]=body_List                    # dictInfo[‘API_descrIDe_List‘]=API_descrIDe_List                    APIInfo_List.append(dictInfo)                                except Exception as error:            # pass            raise(error)        return APIInfo_Listdef write_APIInfo_to_file():    source_data=get_APIInfo()#获取数据来源    print(len(source_data))    file_path=./+name+-APIInfo.txt    with open(file_path,w,enCoding=utf-8) as file:        file.write(str(source_data))write_APIInfo_to_file()
总结

以上是内存溢出为你收集整理的BeautifulSoup模板简单应用-提取html指定数据(api_name/api_method/api_path,请求body/请求header/pagam参数)全部内容,希望文章能够帮你解决BeautifulSoup模板简单应用-提取html指定数据(api_name/api_method/api_path,请求body/请求header/pagam参数)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1051171.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存