[重点]delphi 实现 根据给定的标题去《中国青年报》网上电子报数据中查找匹配的内容,并从该内容中取出引题、正题、副题、作者和正文。
项目要求:根据给定的标题去《中国青年报》网上电子报数据中查找匹配的内容,并从该内容中取出引题、正题、作者和正文。
unit Unit1; interface uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, IdBaseComponent,
IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, Vcl.ComCtrls; type
TForm1 = class(TForm)
IdHTTP1: TIdHTTP;
Button1: TButton;
Label1: TLabel;
Edit1: TEdit;
ProgressBar1: TProgressBar;
Memo1: TMemo;
Button2: TButton;
Memo2: TMemo;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; var
Form1: TForm1; implementation
uses StrUtils,HttpApp;
{$R *.dfm} type
TDelFlags = set of (dfDelBefore, dfDelAfter); function Delstr(var ms: String; endstr: String; Flags: TDelFlags;
bself: Boolean = True): String;
var
l: Integer;
begin
l := length(endstr);
if dfDelBefore in Flags then
begin
if bself then
begin
Result := copy(ms, , pos(endstr, ms) + l - );
Delete(ms, , pos(endstr, ms) + l - );
end
else
begin
Result := copy(ms, , pos(endstr, ms) - );
Delete(ms, , pos(endstr, ms) - );
end;
end
else
begin
if bself then
begin
Result := copy(ms, pos(endstr, ms), length(ms));
Delete(ms, pos(endstr, ms), length(ms));
end
else
begin
Result := copy(ms, pos(endstr, ms) + l, length(ms));
Delete(ms, pos(endstr, ms) + l, length(ms));
end;
end;
end; procedure DelstrEx(var ms: String; endstr: String;
var DelData: String; Flags: TDelFlags; bself: Boolean = True);
var
l: Integer;
begin
l := length(endstr);
if dfDelBefore in Flags then
begin //删除字符串的前半部分
if bself then //连同自己一起删除
begin
DelData := copy(ms, , pos(endstr, ms) + l - );
Delete(ms, , pos(endstr, ms) + l - );
end
else
begin
DelData := copy(ms, pos(endstr, ms) - , length(ms));
Delete(ms, , pos(endstr, ms) - );
end;
end
else
begin
if bself then
begin
DelData := copy(ms, pos(endstr, ms), length(ms));
Delete(ms, pos(endstr, ms), length(ms)); //连同自己一起删除
end
else
begin
DelData := copy(ms, pos(endstr, ms) + l, length(ms));
Delete(ms, pos(endstr, ms) + l, length(ms));
end;
end;
end; {DelstrEx} function GetCenterStr(src, str1, str2: String): String;
var
i, i2, i3: Integer;
begin
i := ;
i2 := ;
i3 := ;
Delstr(src, str1, [dfDelBefore]);
i := pos(AnsiLowercase(str1), AnsiLowercase(src));
i3 := pos(AnsiLowercase(str2), AnsiLowercase(src));
Result := copy(src, i2 + , i3 - i2 - );
end; function delstrByNum(ss:string;uniqueFlag:string;disapperNum:integer;FromFlags: TDelFlags;bReturnDeletedPart:boolean):string;
var _num:integer;
_Str:string;
begin
_num:=;
_Str:=ss; result:=''; while _num<disapperNum do
begin
if dfDelBefore in FromFlags then //从字符串左端开始删除
begin
delstr(_Str,uniqueFlag,FromFlags);
end
else
begin //从字符串右端开始删除
_Str:= StrUtils.ReverseString(_Str) ; if bReturnDeletedPart then
delstrEx(_Str,StrUtils.ReverseString(uniqueFlag),result,[dfdelbefore])
else
delstr(_Str,StrUtils.ReverseString(uniqueFlag),[dfdelbefore]); _Str:= StrUtils.ReverseString(_Str) ;
end; inc(_num);
end; if result='' then result:=_Str
else result:= StrUtils.ReverseString(result) ;
end; function Matchstrings(Source, pattern: String): Boolean;
var
pSource: array[..] of Char;
pPattern: array[..] of Char;
function MatchPattern(element, pattern: PChar): Boolean;
function IsPatternWild(pattern: PChar): Boolean;
begin
Result := StrScan(pattern, '*') <> nil;
if not Result then
Result := StrScan(pattern, '?') <> nil;
end;
begin
if = StrComp(pattern, '*') then
Result := True
else if (element^ = Chr()) and (pattern^ <> Chr()) then
Result := False
else if element^ = Chr() then
Result := True
else
begin
case pattern^ of
'*':
if MatchPattern(element, @pattern[]) then
Result := True
else
Result := MatchPattern(@element[], pattern);
'?':
Result := MatchPattern(@element[], @pattern[]);
else
if element^ = pattern^ then
Result := MatchPattern(@element[], @pattern[])
else
Result := False;
end;
end;
end;
begin
StrPCopy(pSource, Source);
StrPCopy(pPattern, pattern);
Result := MatchPattern(pSource, pPattern);
end; {匹配字符串函数} {从磁盘中搜索指定类型的所有文件}
procedure FindFiles(ASourceDir, SearchFileType: String; var List: TStrings);
var
FileRec: TSearchrec;
Sour, OldFileName, NewFileName: String;
fs: TFileStream;
begin
Sour := ASourceDir;
if Sour[length(Sour)] <> '\' then
Sour := Sour + '\';
if FindFirst(Sour + '*.*', faAnyfile, FileRec) = then
{循环}
repeat
if ((FileRec.Attr and faDirectory) <> ) then
begin
if (FileRec.Name <> '.') and (FileRec.Name <> '..') then //找到目录
begin
FindFiles(Sour + FileRec.Name, SearchFileType, List);
end;
end
else //找到文件
begin
if Matchstrings(LowerCase(FileRec.Name), SearchFileType) then
begin
List.Add(Sour + FileRec.Name);
end; {拷贝所有类型的文件}
end;
until FindNext(FileRec) <> ;
system.SysUtils.FindClose(FileRec);
end; {从磁盘中搜索指定类型的所有文件} procedure RmHtmlTags(var src: string);
function DelTag(var src: string): boolean;
var
iPosS, iPosE: integer;
begin
result := False;
if pos('<script', AnsiLowerCase(src)) > then
begin
iPosS := pos('<script', AnsiLowerCase(src));
if iPosS > then
begin
iPosE := pos('</script>', AnsiLowerCase(src));
result := iPosE > iPosS;
if result then
Delete(src, iPosS, iPosE - iPosS + );
end;
end
else
begin
iPosS := pos('<', src);
if iPosS > then
begin
iPosE := pos('>', src);
result := iPosE > iPosS;
if result then
Delete(src, iPosS, iPosE - iPosS + );
end;
end;
end;
begin
//src := LowerCase(src);
src := src;
repeat
until not DelTag(src);
end; procedure RmHtmlTagsEx(var src: string);
function DelTag(var src: string): boolean;
var
iPosS, iPosE: integer;
begin
result := False;
if pos('<script', AnsiLowerCase(src)) > then
begin
iPosS := pos('<script', AnsiLowerCase(src));
if iPosS > then
begin
iPosE := pos('</script>', AnsiLowerCase(src));
result := iPosE > iPosS;
if result then
Delete(src, iPosS, iPosE - iPosS + );
end;
end
else
if pos('<style', AnsiLowerCase(src)) > then
begin
iPosS := pos('<style', AnsiLowerCase(src));
if iPosS > then
begin
iPosE := pos('</style>', AnsiLowerCase(src));
result := iPosE > iPosS;
if result then
Delete(src, iPosS, iPosE - iPosS + );
end;
end
else
begin
{ iPosS := pos('<', src);
if iPosS > 0 then
begin
iPosE := pos('>', src);
result := iPosE > iPosS;
if result then
Delete(src, iPosS, iPosE - iPosS + 1);
end; }
end;
end;
begin
//src := LowerCase(src);
src := src;
repeat
until not DelTag(src);
end; function UrlDecoder(const AUrl:string):string;
begin
result:= UTF8Decode(HttpDecode(AUrl));
end; function UrlEncoder(const AUrl:string):string;
begin
//URL编码通常使用“+”来替换空格。
result:=HttpEncode(UTF8Encode(AUrl));
end; function getResURL(http:TIdHttp;searchWord:string):string;
var info:tstringlist;
res:tstringstream;
tURL:string;
MemoText: string;
begin
http.HandleRedirects:=true;
http.Request.UserAgent:='Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.2)';
http.Request.Host:='search.cyol.com';
http.Request.ContentType:='application/x-www-form-urlencoded';
http.Request.Referer:='http://search.cyol.com/index.htm';
http.request.CacheControl:='no-cache';
http.HTTPOptions:=http.HTTPOptions+[hoKeepOrigProtocol]; try
info:=tstringlist.Create;
res:=tstringstream.Create('',TEncoding.UTF8); {
info.Add('op=new');
info.Add('searchBtn=搜索');
info.Add('searchText='+searchWord); //全站内模糊搜索
// info.Add('searchText=一日为师 终身挨骂?');
}
info.Add('ak=');
info.Add('ck=');
info.Add('df=');
info.Add('dt=');
info.Add('nk=4');
info.Add('od=date');
info.Add('op=adv');
info.Add('tk='+searchWord); tURL:='http://search.cyol.com/searchh.jsp';
http.Post(tURL,info,res);
MemoText:= res.DataString; delstr(MemoText,'resultdiv',[dfdelbefore]); //showmessage(MemoText); if pos('color:red',ansilowercase(MemoText))= then
begin
result:='';
Exit;
end; delstr(MemoText,'>',[dfdelbefore]);
delstr(MemoText,'<a',[dfdelbefore]);
delstr(MemoText,'http:',[dfdelbefore],false);
delstr(MemoText,'.htm',[dfdelafter],false); result:=MemoText; finally
freeandnil(info);
freeandnil(res);
//http.Free;
end;
end; function getHtmlStr(http:TIdHttp;fURL:string):string;
begin
if assigned(http) and (http is TIdHttp) and (http<>nil) then
result:= http.Get(fURL);
end; procedure TForm1.Button1Click(Sender: TObject); var htmlText:string;
biaoti: string;
Author: string;
yinti: string;
table_Pos: Integer;
ss: string;
outdata: string;
neirong: string;
zhenwen: string;
frontPart: string;
subtitle: string;
txtList: TStrings;
i: Integer;
readtxt: TStringList;
zhenti: string;
resURL: string; begin
button1.Caption:='正在处理'; button1.Enabled:=false; { htmlText:= getHtmlStr(idHTTP1, getResURL(idHTTP1,'一日为师 终身挨骂?') ); frontPart:=htmlText; delstr(frontPart,'<!--enpproperty',[dfdelbefore]);
delstr(frontPart,'/enpproperty',[dfdelafter]); Author:= GetCenterStr(frontPart,'<author>','</author>'); //作者
subtitle:= GetCenterStr(frontPart,'<subtitle>','</subtitle>'); //副题
yinti:= GetCenterStr(frontPart,'<introtitle>','</introtitle>'); //引题 //取正文
zhenwen:=htmlText;
delstr(zhenwen,'<!--enpcontent-->',[dfdelbefore]);
delstr(zhenwen,'<!--/enpcontent-->',[dfdelafter]);
Memo1.Text:=zhenwen; } if not directoryExists(edit1.Text) then
begin showmessage('请输入标引txt的路径!');
exit;
end; txtList:=tstringlist.Create ;
readtxt:=TStringlist.Create ;
findfiles(edit1.Text,'*.txt',txtList); ProgressBar1.Position:=;
ProgressBar1.Max:=txtlist.Count; try for i := to txtList.Count- do
begin
application.ProcessMessages ;
ProgressBar1.Position:=i+; readtxt.LoadFromFile(txtList[i]); zhenti:=readtxt.Values['<主题>']; htmlText:=''; zhenwen:='';
author:='';subtitle:=''; yinti:=''; resURL:=getResURL(idHTTP1,trim(zhenti)); if ''<>trim(resURL) then
begin htmlText:= getHtmlStr(idHTTP1, resURL); frontPart:=htmlText; delstr(frontPart,'<!--enpproperty',[dfdelbefore]);
delstr(frontPart,'/enpproperty',[dfdelafter]); Author:= GetCenterStr(frontPart,'<author>','</author>'); //作者
subtitle:= GetCenterStr(frontPart,'<subtitle>','</subtitle>'); //副题
yinti:= GetCenterStr(frontPart,'<introtitle>','</introtitle>'); //引题 //取正文
zhenwen:=htmlText;
delstr(zhenwen,'<!--enpcontent-->',[dfdelbefore]);
delstr(zhenwen,'<!--/enpcontent-->',[dfdelafter]); RmHtmlTagsEx(zhenwen); if ''<>trim(yinti) then readtxt.Values['<引题>']:=yinti;
if ''<>trim(subtitle) then readtxt.Values['<副题>']:=subtitle;
if ''<>trim(author) then readtxt.Values['<作者>']:=author;
if ''<>trim(zhenwen) then readtxt.Values['<正文>']:=slinebreak+trim(zhenwen); readtxt.SaveToFile(txtList[i]); readtxt.Clear ;
end
else
begin
Memo2.Lines.Add('未找到对应数据:'+txtList[i]);
end; end; // for i end if ProgressBar1.Max=ProgressBar1.Position then
begin
showmessage('处理完成!');
end;
finally
button1.Caption:='开始处理'; button1.Enabled:=true;
freeandnil(readtxt);
freeandnil(txtlist);
end; { delstr(htmlText,'<body',[dfdelbefore]);
biaoti:='biaoti';
//取作者
Author:=htmlText;
delstr(Author,biaoti,[dfdelbefore]);
delstr(Author,'rc-writer',[dfdelbefore]);
delstr(Author,'>',[dfdelbefore]);
delstr(Author,'<',[dfdelafter]); showmessage(Author); //取引题
yinti:=htmlText;
delstr(yinti,biaoti,[dfdelafter]);
table_Pos:=0;
//example: ss:='<table>ccc</table><table>ddd</table>';
yinti:=delstrByNum(yinti,'<table',1,[dfdelafter],true)+'>';
RmHtmlTags(yinti);
showmessage(yinti ); //取正文内容
neirong:='neirong';
zhenwen:=htmlText;
delstr(zhenwen,neirong,[dfdelbefore]);
delstr(zhenwen,'<P',[dfdelbefore],false);
delstr(zhenwen,'<script',[dfdelafter]);
Memo1.Text:=zhenwen;
} end; procedure TForm1.Button2Click(Sender: TObject);
var
ss: string;
begin
ss:=Memo1.Text;
RmHtmlTagsEx(ss);
memo1.Text:=ss;
end; procedure TForm1.FormCreate(Sender: TObject);
begin
edit1.Clear ;
memo2.Clear ;
end; end.
[重点]delphi 实现 根据给定的标题去《中国青年报》网上电子报数据中查找匹配的内容,并从该内容中取出引题、正题、副题、作者和正文。的更多相关文章
- c语言,strcspn,在串中查找第一个给定字符集内容的段
函数名: strcspn 功 能: 在串中查找第一个给定字符集内容的段 用 法: int strcspn(char *str1, char *str2); 程序例: #include <stdi ...
- AnsiString 在 Delphi 中虽然不可用,但是,在 C++ 中可以用
[C++] C++ Builder 中 Ansi 编码的字符串在Android/iOS程序中显示的问题 呃,这个问题说起来,其实也不麻烦,C++ Builder 本身在 TEncoding 做了处理, ...
- ShopNC多用户商城标题去版权 后台去版权方法2.0版本
一.前台标题: \framework\tpl\nc.php 第85行 $output['html_title'] = ( $output['html_title'] != "" ? ...
- [重点]delphi删除部分字符串(不区分大小写)
type TDelFlags = set of (dfDelBefore, dfDelAfter); //删除ms字符串中endstr子字符串前面或后面的部分字符串 procedure Delstr( ...
- LeetCode 34 Search for a Range (有序数组中查找给定数字的起止下标)
题目链接: https://leetcode.com/problems/search-for-a-range/?tab=Description Problem: 在已知递减排序的数组中,查找到给定 ...
- 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去....直到剩下
// test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...
- 在排序数组中查找元素的第一个和最后一个位置(给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。)
示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: [3,4] 示例 2: 输入: nums = [5,7,7,8,8,10], target = 6 输出 ...
- 对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。 给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。若该元素出现多次,请返回第一次出现的位置。
// ConsoleApplication10.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream& ...
- 如何将数组2对象中的属性push进数组1的对象中去,组合成新的数组
随机推荐
- OpenJudge 求重要逆序对数
https://blog.csdn.net/mrvector/article/details/81090165 [题解] 方法与求逆序对的个数类似,用归并排序分治求解.不同之处在于添加了一个虚拟指针p ...
- 第1章 计算机网络和协议(3)_TCP/IP协议
3. TCP/IP协议 3.1 TCP/IP协议分层 3.2 TCP/IP通信过程 (1)应用层:浏览器和Web服务器是两个对等的实现,它们之间使用http协议进行通信. (2)传输层:网页传输之前, ...
- Javascript-关于break、continue、return语句
JS-break:break语句会使运行的程序立刻退出包含在最内层的循环或者退出一个switch语句.由于它是用来退出循环或者switch语句,所以只有当它出现在这些语句时,这种形式的break语句才 ...
- mysql视图 触发器 事物 函数 存储过程
一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...
- python数字
#=====>part1:数字类型#掌握:int,float#了解:Long(在python2中才有),complex# num=10# num=int(10)# print(type(num) ...
- 深度学习 + OpenCV,Python实现实时视频目标检测
使用 OpenCV 和 Python 对实时视频流进行深度学习目标检测是非常简单的,我们只需要组合一些合适的代码,接入实时视频,随后加入原有的目标检测功能. 在本文中我们将学习如何扩展原有的目标检测项 ...
- MySQL多表查询,pymysql模块。
一 多表查询: 首先什么是多表查询: 我们在实际工作中,不可能把数据都存入一个表中,那么又需要这些表之间有一定的关联,因为表与表之间的数据是相关联的,所以就要用到我们的外键将多表连接到一起,那么我们更 ...
- Nginx配置跨域请求“Access-Control-Allow-Origin”
当出现403跨域错误的时候 No 'Access-Control-Allow-Origin' header is present on the requested resource,需要给Nginx服 ...
- Java并发编程:Java Thread 的 sleep() 和 wait() 的区别
1. start 和 run 方法解释: 1) start: 用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码.通过调用Thread类 ...
- [Unity基础]RenderTexture
参考链接: https://www.cnblogs.com/Jimm/p/5951362.html 一.相关API 1.Texture2D.ReadPixels 从RenderTexture.acti ...