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‘) 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参数)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)