我这个代码仅仅限制于在chrome浏览器中下载china daliy的网页中实现删除可视化内容,因为每个网页的超链接或者文本主内容分布不一样,但是学会了删除一个网页类型的不可视化内容之后,修改其他网页的时候或许只需要小小改动代码就可以了,但前提是你需要把你想要删除网页的txt文件中文本内容在哪个位置。(后面附上源代码)
功能代码主要思想:
①找到你下载的txt网页中的可视化内容,找到他的开端与末尾标志性的字符串。
②写一个函数,传进两个字符串,与你网页文本流进行对比,找到开头就开始录入,找到结尾就结束录入。
③因为标志性一般不会很长,所以字符串我们也没有定义很长,可以根据你所下载网页的里面的文本内容标志所定字符串数组空间的大小。
④首先从文本流中找到'<',开始存字符进字符数组 , 找到'>' 结束存字符数组录入,记得加上'\0'让字符数组变成字符串,然后对网页文本开头标志的字符串进行比较,找到了那就开始进行录入文本内容,只能录入可视化文本,而且与之同时你也要对包含"<"">"这两个字符的内容进行比较,也就是重复开头的工作,存字符串,与结尾标志的字符串进行比较,找到了那就结束录入文本内容。
我的方法可能有点笨,适用于没有学过网页设计,网页编码的人,包括我自己,只能用一些投机取巧比较笨的方法来对一个网页进行操作。
你理解了我这个如何删除不可视化内容,也就是保留可视化内容的操作,之后应该会对其他不是用chrome浏览器下载的china daliy网页进行删除不可视化内容了。
{不懂怎么删除超链接的可以先看一下我另一篇相对比较长但是可能会稍微简单的那两篇文章(删除超链接.....:one-> 如何删除超链接——代码 two->为什么要用fprintf删除文本超链接)第一篇有比较完成的代码,第二篇讲的一些文本流输入输出的一些小细节。第二篇写了我下面这个代码为什么用fscanf而不是其他函数的原因,有兴趣的可以了解一下}
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdbool.h>
void deltxt_chrome(char ch, FILE *fp, FILE *temp, char *utter, char *ending);
//删除chrome不可视化内容函数
int main(void)
{
system("mode con cp select=65001");
char ch;
char start_head[100] = "<div class=\"topBar\">";
char end_head[100] = "<footer class=\"mobile-foot\">";
FILE *fp1 = NULL;
FILE *fp2 = NULL;
//这两个字符串是在chrome下载的china daliy网页中文本内容的开始与结尾的标志
/***********删除之前判断是否已经删除不可视化内容*************/
bool open;
fp1 = fopen("D:/大一集合/数据结构实验报告/实验2/temp实验2/chrome.txt", "r");
while(!feof(fp1))
{
if(fgetc(fp1) == '<')
{
if(fgetc(fp1) == '>')
{
open = true;//开 ,代表还没删除不可视化内容
break;
}
}
else open = false;//关 ,代表已经删除了不可视化内容
}
fclose(fp1);
/********************************************************/
/************chrome浏览器删除不可视化内容***************/
if(open == true)
{
fp1 = fopen("D:/大一集合/数据结构实验报告/实验2/temp实验2/chrome.txt", "r");
fp2 = fopen("D:/大一集合/数据结构实验报告/实验2/temp实验2/new_chrome.txt", "w");
//deltxt(ch1, fp1, tmpfp);用临时文件测试,实现删除超链接
deltxt_chrome(ch, fp1, fp2, start_head, end_head);
fclose(fp1);
fclose(fp2);
}
/********************************************************/
return 0;
}
void deltxt_chrome(char ch, FILE *fp, FILE *temp, char *utter, char *ending)//删除chrome不可视化内容
{
char copy[1001];
char search[100000];
//char ch;
int i = -1, j = 0;
int index = -1;
int time = 0;
int star = -1;
int end = -1;
while(!feof(fp))
{
fscanf(fp, "%c", &ch);
if(ch == '<')//存标志字符串
{
index = 1;//表示进来过
pos_1://标记1
for(i = 0; i < 30; i++)
copy[i] = ' ';
copy[0] = '<';
for(i = 1; i < 1000; i++)
{
pos_2:
fscanf(fp, "%c", ©[i]);
if(copy[i] == '<') goto pos_1;
if(copy[i] == '>')
{
copy[i+1] = '\0';
break;
}
}
if(copy[i+1] != '\0')
{
i--;
goto pos_2;//一直扫描到 '>'出现
}
}
if(strcmp(copy, utter) == 0)
{
star = 1;
}
if(star == 1)
{
if(strcmp(copy, ending) == 0)
{
return;
}
while(!feof(fp))
{
fscanf(fp, "%c", &ch);//录入
if(ch != '<')//不是<就写入
{
fprintf(temp, "%c", ch);
}
else
{
goto pos_1;//否则遇到< 就继续从新存标签判断开始和结束
}
}
}
}
}