这个代码因为配置信息的原因不能直接整个拿去用(o゜▽゜)o☆

这个代码因为配置信息的原因不能直接整个拿去用(o゜▽゜)o☆

这个代码因为配置信息的原因不能直接整个拿去用(o゜▽゜)o☆

只能提供一个思路(其实也可以把里面函数拿去用)ˋ( ° ▽、° )

(ง •_•)ง

这个小系统包含一些除任务要求外额外附加的功能

  本来做出来差不多是这个效果基本上来说比任务要求多加了:

  { 1.导入音乐文件并播放;2简单的图形化界面;3.模糊查询功能;}

  所有信息的显示与输入都是在dos窗口完成,图形界面实质只是提供了更加便利调用函数的方式(伪图形化操作)ˋ( ° ▽、° )

    (纳个suprise其实就是随机播放一首导入的音乐。)

   当时使用codeblocks(现在早就转VS)  Win32 GUI project 项目加上制作图形的插件。

    因为时间较长,只记得当时这个软件配置比较麻烦。。就在这只分享一些源码。  

首先文件总体分为三部分(因为用到了这个图形化界面所以多出了main.cpp)

  简单说一下程序的逻辑:开启程序 --> 读取磁盘上的配置文件以检测是否是第一次使用该系统以跳转不同管理模式 --> 第一次使用要求设置密码或者限制一些权限。

  创建链表并从文件读取信息(其实这部没有必要,之间对文件进行操作即可,没必要单独创建链表把文件中的信息挂载上来)

  接下来就是一些查删改等基础操作

先介绍核心部分 ——resource.cpp

 #include<string.h>
#include<stdlib.h>
#include<time.h>
#include<stdio.h>
#include"resource.h"
#include<stdbool.h>
#include <windows.h>
#include<io.h> extern int N1; // 虚拟音乐信息数目
extern int N2; // 音乐文件数目//不超过10个
char add[][]={};// 音乐文件地址
FILE *file1;// 内置默认文件 //moren.txt
FILE *file2;// 用户更改的信息库//data.txt
extern char code[];// 记录密码
extern MUSIC *head;
extern bool FFLAG;//FFLAG 是否第一次使用该系统
extern bool FLAG;//FLAG 是否拥有管理员权限
extern FILE *fp;
MUSIC *nowlist;// 链表最后一个节点
MUSIC *now;// 在链表中移动的节点
void print_help(void)// 帮助按钮
{
printf("请通过按钮选择你所需要的功能\n"
"ps: 1.第一次使用,请先初始化并刷新音乐库\n"
" 2.若要播放音乐,请先刷新音乐库\n"
" 4.通过CLEAR按键清除屏幕\n"
" 3.若要退出系统请先关闭图形化窗口,不要直接关闭dos窗口\n");
} void Scanf(MUSIC *now)// 读取MUSIC
{
scanf("%d%s%s%s",&canshu);
}
void Printf(MUSIC *now)// 打印MUSIC
{
printf("%7d%10s%10s%10s\n",canshu);
}
void Fscanf(MUSIC *now,FILE *nowf)// 从文件中获取信息
{
fscanf(nowf,"%d%s%s%s",&canshu);
}
void Fprint(MUSIC *now,FILE *nowf)// 将输入的信息保存到文件中
{
fprintf(nowf,"%d %s %s %s ",canshu);
}
void Fprint1(MUSIC *now,FILE *nowf)// 将输入的信息保存到文件中
{
fprintf(nowf,"%d %s %s %s\n",canshu);
}
void chushihua1(void)// 预置信息
{
printf("第一次使用,请先设置密码\n");
setcode();
CreatList(head,,);
}
void chushihua(void)// 初始化按键功能
{
if(FFLAG==true)printf("你还没有管理员权限,请先登录\n");
else{chushihua1();return;}
if(FLAG)//如果有权限
{
fp=fopen("C:\\Users\\EA\\Desktop\\date.txt","w");
chushihua1();
fclose(fp);
}
else printf("你还没有管理员权限,请先登录\n");
}
void setcode(void)// 设置密码
{
scanf("%s",code);
printf("密码设置成功!!\n");
}
void onling(void)// 管理员登陆
{
char nowcode[]={};
printf("请输入密码\n");
scanf("%10s",nowcode);
while(!Strcmp(code,nowcode,strlen(code),strlen(nowcode)))
{////如果密码正确
printf("密码错误,请再次输入"
"若取消登陆,请输入Q\n");
memset(nowcode,,sizeof(nowcode));
scanf("%s",nowcode);
if(*nowcode=='Q'&&strlen(nowcode)==)break;//如果用户选择退出
}
if(strlen(nowcode)!=){printf("登陆成功\n");FLAG=true;}
}
int Strcmp(const char *x,const char *y,int n,int m)// 密码比较
{
int i=;
if(n!=m)return ;
while(*x==*y&&*x&&*y){i++;x++;y++;}
if(i==m)return ;
return ;
}
void play_sound(void)// 随机播放音乐
{
srand(time(NULL));
PlaySound(TEXT(add[rand()%N2]),NULL, SND_ASYNC | SND_NODEFAULT);
}
void CreatList(MUSIC *head,int n,int m)// 创建链表,并保存数据
{
N1+=n;// 虚拟信息数目
int i = ;// 当m==0初始化读取预置信息,否则创建新的节点
if(m==){file1=fopen("C:\\Users\\EA\\Desktop\\moren.txt","r");nowlist = (MUSIC*)head;}
else{nowlist->next = (MUSIC *)malloc(sizeof(MUSIC));nowlist=nowlist->next;}
for(i=; i<n; i++)
{
if(m==)Fscanf(nowlist,file1);//从预置信息文件读取信息
else Scanf(nowlist);
if(i<n-)// 当节点数量小于所需数量
{
nowlist ->next =(MUSIC *)malloc(sizeof(MUSIC));
nowlist = nowlist ->next;
}
}
nowlist->next=NULL;
if(m==)fclose(file1);
//fclose(file2);
}
void load_music_info(void)// 在链表后加入新节点
{
int n=;
printf("请输入你想要导入音乐信息的数量:");
scanf("%d",&n);
printf("请按以下格式输入信息:\n"
"0001 musicname singer album\n");
CreatList(nowlist,n,);
} void search_actual(int x)// 寻找真实具有的音乐
{
N2=;// 将文件数目初始化为0
long hand;
struct _finddata_t fileinfo;
int i=;
char fileadd[]="C:\\Users\\EA\\Music\\shili\\";//在该文件下搜索
char fileformat[]="*.wav";// 搜索该格式文件
char name[];
strcpy(name,fileadd);
strcat(name,fileformat);
hand=_findfirst(name,&fileinfo);
if(hand!=-1L)
{
if(x!=)printf("音乐库有以下音乐文件:\n");
do
{
strcpy(name,fileadd);
strcat(name,fileinfo.name);
if(x!=)printf("%s\n",fileinfo.name);
strcpy(add[i++],name);// 把音乐文件路径保存下来
N2++;// 如果扫描到一个,则真实文件数目加1
}while(_findnext(hand,&fileinfo)==);
}
// if(x!=0)else{printf("no sereach !!!\n");}
for(i=; i<N2; i++)abss(add[i],add[i]);
}
void abss(char *x,char*z)// 转化成绝对地址
{
int k=;
char b[] = {};
for(; (*x)!=; x++,k++)
{
if((*x)!='\\')b[k]=*x;
else{b[k++]='\\';b[k]='\\';}
}
b[k]=;strcpy(z,b);
} void chudu(void)// 从系统文件加载信息
{
file2=fopen("C:\\Users\\EA\\Desktop\\date.txt","r");
int i = ;
MUSIC *nowlist = (MUSIC*)head;// 把磁盘信息导入到链表中
for(i=; i<N1; i++)
{
Fscanf(nowlist,file2);
if(i<N1-)
{
nowlist ->next =(MUSIC *)malloc(sizeof(MUSIC));
nowlist = nowlist ->next;
}
}
nowlist->next=NULL;
fclose(file2);
}
void view_all(void)// 显示所有链表信息
{
printf("共有%d条音乐信息!!\n",N1);
now = (MUSIC *)head;
while(now)
{
printf("%04d%12s%12s%12s\n",canshu);
now = now->next;
}
}
void revise(void)// 修改音乐信息
{
int n;
int m=;
printf("请输入你想要修改的音乐编号;");
scanf("%d",&n);
now = (MUSIC *)head;
while(now)
{
if(now->next->number==n)
{
printf("请输入更改后的信息;\n");
Scanf(now->next);m=;break;
}
now = now->next;
}
if(m==)printf("no search!!\n");
else printf("修改成功!!\n");
}
int searchname(int x,int y)// 系列查找
{
int i=;
int m=;
char name1[]={};
if(x==)printf("请输入你想要查询的歌手:");
else
{
if(y==)printf("请输入你想要播放的音乐名:");
else printf("请输入你想要查询的音乐名:");
}
scanf("%s",name1);
now = (MUSIC *)head;
while(now)
{
if(x==)
{if(Strcmp(now->S_N,name1,strlen(now->S_N),strlen(name1)))
{Printf(now);m=;break;}}
else
{
if(Strcmp(now->M_N,name1,strlen(now->M_N),strlen(name1)))
{Printf(now);m=;if(y==)return i;break;}//当x==0,y==1,返回查找所要播放音乐文件的地址下标
}
now = now->next;
i++;
}
if(m==)printf("no search!!\n");
return -;
}
void play(void)// 输入音乐名播放音乐
{
int i=-;
i = searchname(,);
if(i!=-){printf("请欣赏!!\n");PlaySound(TEXT(add[i]),NULL, SND_ASYNC | SND_NODEFAULT);}
}
void searchkey(void)// 关键字查找
{
int i=;
int m=;
char name1[]={};
printf("请输入你想查找的关键字:");
scanf("%s",name1);
now = (MUSIC *)head;
while(now)
{
if(strstr(now->M_N,name1)||strstr(now->S_N,name1))
{Printf(now);i++;m=;}
now = now->next;
}
printf("共找到了%d条相关信息!!\n",i);
if(m==)printf("未找到\n");
} void wenjian(void)
{
printf("请把音乐文件放入C:\\Users\\EA\\Music\\shili\n");
printf("请按以下格式输入你导入音乐信息:\n"
"0001 musicname singer album\n");
charu();// 在真实音乐文件信息后插入
}
void charu(int x)
{
now = (MUSIC*)head;
MUSIC *nowlist2 = (MUSIC*)malloc(sizeof(MUSIC));// 要插入的节点信息
int i=;
if(x==)for(i=; i<N2-; i++)now=now->next;//在预置音乐后插入真实音乐文件信息
else
{
int n;
printf("请输入你想要插入的位置:");
scanf("%d",&n);
if(n<N2){printf("前%d个为系统预置,不能插入!!\n",N2);return;}
for(i=; i<n-; i++)now=now->next;
printf("请输入音乐信息:\n"); }
Scanf(nowlist2);
nowlist2 ->next = now->next;
now ->next = nowlist2;
if(x==)
{
file1=fopen("C:\\Users\\EA\\Desktop\\moren.txt","a+");
fprintf(file1,"%04d %s %s %s\n",nowlist2->number,nowlist2->M_N,nowlist2->S_N,nowlist2->album);
fclose(file1);
}
if(x!=){N1++;printf("插入成功!!\n");}
if(x==)printf("保存成功!!\n");
if(x==)search_actual();
}
void sc(void)
{
int m=;
now = (MUSIC*)head;
MUSIC *nowlist2;
int num;
printf("请输入你要删除音乐的编号:");
scanf("%d",&num);
if(num<=N2){printf("预置音乐无法删除!!\n");return;}
while(now)
{
if(now->next->number==num)
{
nowlist2 = now->next;
now->next = nowlist2->next;
free(nowlist2);m=;
break;
}
now = now->next;
}
if(m==)printf("删除成功!!\n");
else printf("no search!!\n");
}
void baocun(void)
{
file2=fopen("C:\\Users\\EA\\Desktop\\date.txt","w");
now = (MUSIC*)head;
N1=;
while(now)
{
N1++;//音乐信息文件++
Fprint(now,file2);
now = now->next;
}
fclose(file2);
}
void px(void)// 排序
{
//先把所有信息放在数组上,再对数组进行排序,再把信息返回链表
int i=;
int j=;
MUSIC a[N1];
now = (MUSIC*)head;
while(now)
{a[i].number = now->number;
strcpy(a[i].M_N,now->M_N);
strcpy(a[i].S_N,now->S_N);
strcpy(a[i].album,now->album);
now=now->next;i++;}
int minnum;
int mins;
now = (MUSIC*)head;
MUSIC temp;
for(i=; i<N1; i++)// 选择排序
{
minnum=a[i].number;
mins = i;
for(j=i; j<N1; j++)
{if(a[j].number<minnum)
{minnum = a[j].number;mins = j;}}
if(i!=mins)//MUSIC类型变量交换
{
sscp(&temp,&a[mins]);
sscp(&a[mins],&a[i]);
sscp(&a[i],&temp);
}
if(i>=N2)//对除预置信息外的音乐排序
{
now->number=a[i].number;
strcpy(now->M_N,a[i].M_N);
strcpy(now->S_N,a[i].S_N);
strcpy(now->album,a[i].album);
}
now=now->next;
}
}
void sscp(MUSIC *x,MUSIC *y)// MUSCI类型赋值
{
x->number = y->number;
strcpy(x->M_N,y->M_N);
strcpy(x->S_N,y->M_N);
strcpy(x->album,y->M_N);
}

resource.cpp

  因为用到了查找磁盘上音乐文件,所以可能要用到c++函数(时间长了不确定了)

接下来是头文件——里面包含了一些按钮的定义是图形化插件主动创建的,这些按钮将在main.cpp检测是否点击按钮

 #ifndef IDC_STATIC
#define IDC_STATIC (-1)
#define canshu now->number,now->M_N,now->S_N,now->album typedef struct MUSIC
{
int number;// 编号
char M_N[];// 歌曲名
char S_N[];// 歌唱者
char album[];// 专辑
struct MUSIC *next;
}MUSIC;
int Strcmp(const char *,const char *,int ,int );// 核对密码 //前两个字符串。后两个字符串长度
void setcode(void);// 设置密码
void chushihua(void);// 系统初始化
void chushihua1(void);// 导入预存歌曲信息
void Printf(MUSIC *);// 将信息打印
void Fprint(MUSIC *,FILE *);// 将信息保存到文件中
void Scanf(MUSIC *);// 从键盘获取成员信息
void Fscanf(MUSIC *,FILE *);// 从文件获取成员信息
void onling(void);// 登陆
void print_help(void);// 打印帮助信息
void CreatList(MUSIC *,int n,int m);// 创建链表 //n:创建的链表数,m==0,导入默认信息,m==1,加入新的节点
void play_sound(void);// 播放音乐
void abss(char *,char*);// 转化绝对地址
void search_actual(int);// 查看真实存在的音乐
void load_music_info(void);// 录入音乐信息
void view_all(void);// 显示所有音乐信息
void revise(void);// 修改音乐信息
int searchname(int x,int y);// 系列查询 //当x==1查询歌手,否则{当y==1时寻找要播放的音乐名,否则查询音乐名}
void searchkey(void);// 模糊查找
void play(void);// 播放音乐
void chudu(void);// 从文件中读取数据
void baocun(void);// 保存数据到文件
void charu(int x);// 插入音乐信息 //当x==1时导入真实音乐信息,否则插入虚拟信息
void wenjian(void);// 导入音乐文件
void sscp(MUSIC *x,MUSIC *y);// MUSIC类型赋值
void px(void);// 排序
void sc(void);// 删除音乐信息 #endif #define DLG_MAIN 100
#define daoruxinxi 40000
#define search_singer 40001
#define Surprise 40002
#define On 40003
#define Off 40004
#define search_key 40005
#define INITIALISE 40006
#define daoruwenjian 40007
#define xiugaixinxi 40008
#define onlin 40009
#define CLEAR 40010
#define HELP 40011
#define settcode 40012
#define bofangyinyue 40013
#define shuaxin 40014
#define search_name 40015
#define xianshixinxi 40016
#define charuxinxi 40018
#define paixu 40019
#define shanchuxinxi 40020

recourse.h

最后就是一个Win32 GUI project的框架

  主要是检测按钮是否被按下以调用对应函数

 #include <windows.h>
#include <commctrl.h>
#include <stdio.h>
#include <windef.h>
#include "resource.h"
#include <mmsystem.h>
int N1=;// 虚拟文件数目
int N2=;// 真实文件数目
bool FFLAG = false;// 是否第一次使用系统(有没有创建数据文件)
bool FLAG= false;// 是否具有管理员权限
FILE *fp;// 配置信息文件
char code[];// 保存密码
MUSIC *head = (MUSIC *)malloc(sizeof(MUSIC));
HINSTANCE hInst;
BOOL CALLBACK DlgMain(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{ switch(uMsg)
{
case WM_INITDIALOG:
{
printf("欢迎使用歌曲管理系统!!\n");
search_actual();
if((fp=fopen("C:\\Users\\EA\\Desktop\\setting.txt","r"))==NULL)
{FFLAG = ;printf("您是第一次使用本系统,请先初始化。\n");}
else
{fscanf(fp,"%s%d%d",code,&N1,&N2);chudu();fclose(fp);}//从配置文件读取信息
}
return TRUE; case WM_CLOSE:
{
EndDialog(hwndDlg, );
baocun();// 则保存链表信息到文件
fp=fopen("C:\\Users\\EA\\Desktop\\setting.txt","w");
fprintf(fp,"%s %d %d",code,N1,N2);//把配置信息保存至文件
fclose(fp);
printf("谢谢你的使用!\n");
}
return TRUE; case WM_COMMAND:
{
switch(LOWORD(wParam))
{
case HELP:// 打印help
{print_help();break;}
case INITIALISE:// 初始化
{chushihua();break;}
case onlin:// 登陆
{onling();break;}
case On:// 随机播放音乐
{play_sound();break;}
case Off:// 关闭音乐
{PlaySound(NULL,NULL,SND_FILENAME);break;}
case Surprise:// 随机播放音乐
{play_sound();break;}
case shuaxin:// 刷新音乐库列表
{search_actual();break;}
case xianshixinxi:// 显示所有音乐信息
{view_all();break;}
case search_name:// 按名称查询
{searchname(,);break;}
case search_singer:// 按歌手查询
{searchname(,);break;}
case search_key:// 关键字查询
{searchkey();break;}
case CLEAR:// 清理屏幕
{system("cls");printf("欢迎使用歌曲管理系统!!\n");break;}
case bofangyinyue:// 选择播放音乐
{play();break;}
case paixu:// 对音乐信息进行排序
{px();break;}
case charuxinxi:// 插入音乐信息
{ if(FLAG)charu();
else printf("你还没有管理员权限,请先登陆\n");
break;
}
case shanchuxinxi:// 删除音乐信息
{
if(FLAG)sc();
else printf("你还没有管理员权限,请先登陆\n");
break;
} case daoruwenjian:// 导入音乐文件
{
if(FLAG)wenjian();
else printf("你还没有管理员权限,请先登陆\n");
break;
}
case xiugaixinxi:// 修改音乐信息
{
if(FLAG)revise();
else printf("你还没有管理员权限,请先登陆\n");
break;
}
case settcode:// 设置密码
{
if(FLAG){printf("请输入你修改后的密码:");setcode();}
else printf("你还没有管理员权限,请先登陆\n");
break;
}
case daoruxinxi:// 加入音乐信息
{
if(FLAG)load_music_info();
else printf("你还没有管理员权限,请先登陆\n");
break;
}
}
}
return TRUE;
}
return FALSE;
} int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
hInst=hInstance;
InitCommonControls();
return DialogBox(hInst, MAKEINTRESOURCE(DLG_MAIN), NULL, (DLGPROC)DlgMain);
}

main.cpp

源文件

链接:https://pan.baidu.com/s/1JHDw9HnoC4VtaUurJRrl3w
提取码:lfmg
复制这段内容后打开百度网盘手机App,操作更方便哦

c语言课程设计--图书/音乐管理系统的更多相关文章

  1. C语言课程设计—图书管理系统

    这是本人大一第二学期初C语言课程设计的作品,嘿嘿,本来以为已经找不到原稿了,今天无意中居然在QQ网络硬盘中找到了当初的teta版,公布于此,以作纪念. C源码例如以下: #include<std ...

  2. 大一C语言课程设计——班级档案管理系统

    记录我在大一第二学期期末做的C语言课程毕业设计 1. 班级档案管理系统运用到的主要结构体 typedef struct birthday //出生日期{int year;int month;int d ...

  3. 学生管理系统-火车订票系统 c语言课程设计

    概要: C 语言课程设计一---学生管理系统 使使用 C 语言实现学生管理系统.系统实现对学生的基本信息和考试成绩的 管理.采用终端命令界面,作为系统的输入输出界面.采用文件作为信息存储介质. 功能描 ...

  4. C语言课程设计(成绩管理系统)

    C语言课程设计(成绩管理系统) 翻到了大学写的C语言课程设计,缅怀一下 内容: 增加学生成绩 查询学生成绩 删除 按照学生成绩进行排序 等 #include <stdio.h> #incl ...

  5. Java语言课程设计——博客作业教学数据分析系统(201521123107 张翔)

    #Java语言课程设计--博客作业教学数据分析系统(个人博客) 1.团队课程设计博客链接 [博客作业教学数据分析系统(From:网络五条狗)](http://www.cnblogs.com/fanta ...

  6. Java课程设计——学生成绩管理系统(201521123003 董美凤)

    Java课程设计--学生成绩管理系统(201521123003 董美凤) 1.团队课程设计博客链接 学生成绩管理系统博客链接 2.个人负责模块或任务说明 信息修改 密码修改 部分界面设计 3.自己的代 ...

  7. 记C++课程设计--学生信息管理系统

                                                                                  C++课程设计--学生信息管理系统     ...

  8. C语言课程设计

    目录 实现目的 游戏玩法介绍 实现流程与作品架构 任务列表及贡献度 总结感想 作品源码与仓库地址(附页) 资料引用与出处(附页) 实现目的 2048,作为一款极其经典的游戏,从发行到现在,已经有了极多 ...

  9. Java课程设计—学生成绩管理系统(201521123005 杨雪莹)

    一.团队课程设计博客链接 学生成绩管理系统 二.个人负责模块或任务说明 学生成绩录入 显示所有学生信息 显示各科平均成绩 显示学生成绩(按降序排序) 三.自己的代码提交记录截图 四.自己负责模块或任务 ...

随机推荐

  1. CentOS7使用firewalld管理防火墙与端口

    firewalld的基本使用 启动: systemctl start firewalld 关闭: systemctl stop firewalld 查看状态: systemctl status fir ...

  2. ERROR 1176 (42000): Key 'XXX' doesn't exist in table 'XXX'报错处理

    MySQL5.7对sql语句强制使用索引查询时报错如下: 解决:这里的id字段是表的主键,查看别人的经验贴得知是语法错误,参考链接https://stackoverflow.com/questions ...

  3. swoole I/O 模型

    I/O即Input/Output,输入和输出的意思.在计算机的世界里,涉及到数据交换的地方,比如磁盘.网络等,就需要I/O接口. 通常,I/O是相对的.比如说你打开浏览器,通过网络I/O获取我们网站的 ...

  4. 时尚起义开源话题微博系统 v.0.4.5 上传漏洞

    漏洞出现在/action/upload.php文件中 <?php /** ** **By QINIAO **/ !defined('QINIAO_ROOT') && exit(' ...

  5. SpringBoot(七)-SpringBoot JPA-Hibernate

    步骤 1.在pom.xml添加mysql,spring-data-jpa依赖2.在application.properties文件中配置mysql连接配置文件3.在application.proper ...

  6. 【底层原理:深入理解计算机系统】#1 一切从"hello world"说起 (一)

    计算机系统是由硬件和系统软件组成的,他们共同工作来运行应用程序.虽然系统的具体实现方式随着时间不断的在变化,但是系统的内在概念却没有改变的. 所有的计算机硬件和软件有着相似的结构和功能.这个系列专题便 ...

  7. Hibernate入门之主键生成策略详解

    前言 上一节我们讲解了Hibernate命名策略,从本节我们开始陆续讲解属性.关系等映射,本节我们来讲讲主键的生成策略. 主键生成策略 JPA规范支持4种不同的主键生成策略(AUTO.IDENTITY ...

  8. 【Java】Map总结和源码注释

    前言 Map为一个Java中一个重要的数据结构,主要表示<key, value>的映射关系对.本文包括了相关Map数据结构的总结和源码的阅读注释. HashMap 初始化,可以选择第二个初 ...

  9. YiGo环境搭建

    软件环境 操作系统:Windows 2000+,Mac OS,AIX,RedHat linux,HP-UX等 JDK/JRE:Oracle JDK/JRE 1.8+,IBM J9 VM 1.8+,Op ...

  10. Python中的BeautifulSoup库简要总结

    一.基本元素 BeautifulSoup库是解析.遍历.维护“标签树”的功能库. 引用 from bs4 import BeautifulSoup import bs4 html文档-标签树-Beau ...