/******************************************************
首先根据规则提取,如果没有找到对应域名规则,则用一般的
方法提取。一般的方法,考虑到了文本长度,中文字符数,文
本连续程度信息。对于非表格信息处理较良。
*****************************************************/
#include "File.h"
#include "FileDir.h"
#include <vector>
#include <stack>
#include <string>
#include <algorithm>
#include "ExtractText.h"
#include <stdio.h>
#include <exception>
#include "RuleStruct.h"
using namespace std;
ExtractText::ExtractText()
{
;
}
ExtractText::ExtractText(string srcFilePath,string srcFileName,string desFilePath,string desFileName)
{
inFilePath=srcFilePath;
inFileName=srcFileName;
outFilePath=desFilePath;
outFileName=desFileName;
}
ExtractText::~ExtractText()
{
vecSrcFile.clear();
vecDesFile.clear();
strSrcFile.clear();
vecRuleContent.clear();
}
//设定输入文件目录
bool ExtractText::setInFilePath(string srcFilePath)
{
inFilePath=srcFilePath;
return true;
}
//设置输入文件名
bool ExtractText::setInFileName(string srcFileName)
{
inFileName=srcFileName;
//printf("%s\n",inFileName.c_str());
return true;
}
//设输出文件目录
bool ExtractText::setOutFilePath(string desFilePath)
{
outFilePath=desFilePath;
//printf("%s",outFilePath.c_str());
return true;
}
//设置输出文件名
bool ExtractText::setOutFileName(string desFileName)
{
outFileName=desFileName;
//printf("%s\n",outFileName.c_str());
return true;
}
//把原文件读入到vecSrcFile
bool ExtractText::readFileToSrcVec()
{
//首先清空内存文件
vecSrcFile.clear();
File file;
file.setPath(inFilePath+inFileName);
return file.read(vecSrcFile);
}
//把原文件读入到strSrcFile
bool ExtractText::readFileToSrcStr(string srcFile)
{
//首先清空内存文件StrSrc
strSrcFile.clear();
File file;
file.setPath(srcFile);
return file.read(strSrcFile);
}
//把原文本的字母转为小写
bool ExtractText::convertVecSrcToLower()
{
vector<string>::iterator vIterBegin, vIterEnd;
vIterBegin = vecSrcFile.begin();
vIterEnd = vecSrcFile.end();
for( ; vIterBegin != vIterEnd; vIterBegin++ )
{
transform( (*vIterBegin).begin(), (*vIterBegin).end(), (*vIterBegin).begin(), tolower );
}
return true;
}
//把原文本的字母转为小写
bool ExtractText::convertStrSrcToLower()
{
transform( strSrcFile.begin(), strSrcFile.end(), strSrcFile.begin(), tolower );
return true;
}
//从字符串里面抽取中文
bool ExtractText::extractChineseTextFromString(string &textLine)
{
if(textLine.empty())
return true;
string::size_type iter=0;
//string::size_type end=textLine.size();
for(;iter<textLine.size();)
if((int)textLine.at(iter)>0)
{
textLine.erase(iter,1);
}
else iter++;
return true;
}
//从字符串里面抽取中文
bool ExtractText::extractChineseTextFromVec(vector<string> &vecStr)
{
if(vecStr.empty())
return true;
vector<string>::iterator iter=vecStr.begin();
string textLine;
//string::size_type end=textLine.size();
for(;iter!=vecStr.end();)
{
textLine=*iter;
extractChineseTextFromString(textLine);
vecStr.erase(iter);
if(!textLine.empty())
{
vecStr.insert(iter,1,textLine);
iter++;
}
}
return true;
}
//删除单个字符串
bool ExtractText::removeStrFromVec(string strDel)
{
vector<string>::iterator vIterBegin, vIterEnd;
vIterBegin = vecSrcFile.begin();
vIterEnd = vecSrcFile.end();
for( ; vIterBegin != vIterEnd; vIterBegin++ ) //处理每一行
{
string::size_type pos = (*vIterBegin).find( strDel );
//erase the stringDel in vector
while ( pos != string::npos )
{
(*vIterBegin).erase( pos, strDel.length() );
pos = (*vIterBegin).find( strDel );
}
}
return true;
}
//删除单个字符串
bool ExtractText::removeStrFromStrSrc(string strDel)
{
string::size_type pos = strSrcFile.find( strDel );
//erase the stringDel in vector
while ( pos != string::npos )
{
strSrcFile.erase( pos, strDel.length() );
pos = strSrcFile.find( strDel,pos );
}
return true;
}
//从VecFile里面删除字符串
bool ExtractText::removeStrsFromVec(vector<string>vecStrsDel)
{
vector<string>::iterator vIterBegin, vIterEnd;
vIterBegin = vecSrcFile.begin();
vIterEnd = vecSrcFile.end();
for( ; vIterBegin != vIterEnd; vIterBegin++ )
{
for(vector<string>::iterator iter=vecStrsDel.begin();iter!=vecStrsDel.end();iter++)
{
string::size_type pos=(*vIterBegin).find((*iter));
while ( pos != string::npos )
{
(*vIterBegin).erase( pos, (*iter).length() );
pos = (*vIterBegin).find( (*iter) );
}
}
}
return true;
}
//从StrSrc里面删除字符串
bool ExtractText::removeStrsFromStr(vector<string>vecStrsDel)
{
for(vector<string>::iterator iter=vecStrsDel.begin();iter!=vecStrsDel.end();iter++)
{
string::size_type pos=strSrcFile.find((*iter).c_str());
while ( pos != string::npos )
{
strSrcFile.erase( pos, (*iter).length() );
pos = strSrcFile.find( (*iter) ,pos);
}
}
return true;
}
//把两个字符串之间的内容去掉,例如<script>与</script>之间的所有内容
bool ExtractText::removeSmbol(std::string smbol1,std::string smbol2)
{
string::size_type head=0;
string::size_type nexthead=0;
string::size_type tail=1;
stack<int>stkPos;
head=strSrcFile.find(smbol1.c_str());
stkPos.push(0);
stkPos.push((int)head);
while (head!=string::npos&&nexthead!=string::npos)
{
nexthead=strSrcFile.find(smbol1.c_str(),head+1);
tail=strSrcFile.find(smbol2.c_str(),head);
//printf("%d,%d,%d\n",head,tail,nexthead);
if(tail==string::npos)
break;
if(nexthead!=string::npos&&nexthead<tail)
{
//printf("push agin %d,%d\n",nexthead,tail);
head=nexthead;
stkPos.push((int)head);
}
else
{
if(!stkPos.empty())
{
head=stkPos.top();
strSrcFile.erase(head,tail-head+smbol2.length());
stkPos.pop();
head=stkPos.top();
}
else break;
}
}
while(!stkPos.empty())
stkPos.pop();
return true;
}
//*/
//抽取正文
bool ExtractText::extractText()
{
//读取文件到vecSrcFile
if(strSrcFile.empty())
return false;
//转换为小写字母
convertStrSrcToLower();
int head=0;
int tail=0;
head=strSrcFile.find("</head>");
if(head==string::npos)
return false;
strSrcFile.erase(0,head);
//利用规则提取正文信息,并且这种网页保留制表信息
bool f=fliterTextFormStrSrc();
if(f)
tidyTableTrTd();
//删除格式信息,以及一些函数信息
removeSmbol(string("<script"),string("/script>"));
//removeSmbol(string("{"),string("}"));
//删除标签里面的内容
//*
head=strSrcFile.find("<");
tail=strSrcFile.find(">");
while(head!=string::npos&&tail!=string::npos)
{
if(head>tail)
strSrcFile.erase(tail,1);
else
{
bool fp=(strSrcFile.at(head+1)=='p');
strSrcFile.erase(head,tail-head+1);
if(fp)
strSrcFile.insert(head,1,'\n');
strSrcFile.insert(head,1,' ');
}
head=strSrcFile.find("<");
tail=strSrcFile.find(">");
}
//*/
//删除扩后里面的内容
/*
head=strSrcFile.find("(");
tail=strSrcFile.find(")");
while(head!=string::npos&&tail!=string::npos)
{
if(head>tail)
strSrcFile.erase(tail,1);
else
{
strSrcFile.erase(head,tail-head+1);
}
head=strSrcFile.find("(");
tail=strSrcFile.find(")");
}
*/
//去掉&xxx;之类的符号
deleteSmbol();
vector<string>vecStrsDel;
vecStrsDel.push_back(string("■"));
vecStrsDel.push_back(string(" "));
removeStrsFromStr(vecStrsDel);
vecStrsDel.clear();
//根据规则过滤文件,若失败进行正文段的计算
if(!f)
{
maxSectionStrSrcFile(head,tail);
return true;
}
//删除一些格式信息
tidyText();
return true;
}
//存储文件到目录
bool ExtractText::saveResultToDesFile()
{
File file;
string::size_type pos=outFileName.find_last_of(".");
string tempName=outFileName.substr(0,pos)+string(".txt");
file.setPath(outFilePath+tempName);
return file.write