网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 大学论文导航 设计下载 最新论文 下载排行 原创论文 设计图标 Ppt模板 Flash素材 PSD素材 JS代码
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 交易代码 > Delphi精品代码 > 正文

从网页源文件中获取链接的两种方法

来源:http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 10/11/06

这几天打算做一个网站内容提取器,第一步就是如何获取网页中的链接,我不打算用
"TWebBrowser"控件,那玩意初试化的时候贼慢,我打算用TIdHttp控件获取网页源码,
不过TIdHttp控件链接"https"(SSL安全通信)类型的超链接的时候要绑定SSL,关于
TIdHttp控件绑定SSL的方法可以参考本站的文章,链接地址:
http://sz319.net.ru/article/artinfo.aspx?TypeID=21&PageNum=1&Keystr=&looktype=&artid=124
不过一般都是"http"的,看几篇文章没必要搞个SSL安全通信吧。

下面列举获取网页中链接的两种方法:
先获取网页源码:

var
  Data : TMemoryStream;  //Create,Destroy 略过
  httpclient: TIdHTTP;

function TForm1.GetHtml(strUrl:string):string;
var
  bufdata:pointer;
begin
  result := '''';
  Data.clear();
  httpclient.Get(strUrl,data);
  GetMem(bufdata,data.Size);
  data.Position := 0;
  data.ReadBuffer(bufdata^,data.Size);
  result := strpas(bufdata);
  freemem(bufdata,data.Size);
end;

方法一:利用IHTMLDocument2
uses MSHTML;
procedure TForm1.SetDoc(strhtml:string);
var
  IDoc:IHTMLDocument2;
  ilen:integer;
  all:IHTMLElementCollection;
  len,i : integer;
  item:OleVariant;
  v:Variant;
  strUrl:string;
begin
  ilen := Length(strhtml);
  IDoc:= CreateComObject(Class_HTMLDOcument) as IHTMLDocument2;
  
  try
    IDoc.designMode :=''on'';
    while   IDoc.readyState   <>   ''complete''   do
       Application.ProcessMessages;
      
    v:=VarArrayCreate([0,0],VarVariant);
    v[0]:=strhtml;
    IDoc.write(PSafeArray(System.TVarData(v).VArray));
    IDoc.designMode:=''off'';
    
    while   IDoc.readyState   <>   ''complete''   do
      Application.ProcessMessages;

    all := IDoc.links;
    len:=all.length;
    for i:=0 to len-1 do begin
      item:=all.item(i,varempty);       //EmpryParam亦可
      memo1.lines.add(item.href);        
    end;
  
  finally
    IDoc   :=   nil;
  end;
end;

方法二:利用正则表达式
必须先导入单元
Project->Import Type Library:Microsoft VBScript Regular Expressions 5.5(Version5.5)

uses VBScript_RegExp_55_TLB;
procedure TForm1.SetRegDoc(strhtml:string);
var
  objExp : TRegExp;
  machs:IMatchCollection;
  Matchs : Match;
  i : integer;
begin
  objExp := TRegExp.Create(self);
  objExp.Pattern := ''((http|https):(\/\/|\\\\)((\w)+[.]){1,}(net|com|cn|org|cc|tv|([0-9]{1,3}))(((\/[\~]*|\\[\~]*)(\w)+)|[.](\w)+)*(((([?](\w)+){1}[=]*))*((\w)+){1}([\&](\w)+[\=](\w)+)*)*)'';
  objExp.IgnoreCase := true;
  objExp.Global := True;
  machs := objExp.Execute(strhtml) as IMatchCollection;
  for i := 0 to machs.Count - 1 do begin
    Matchs := machs.Item[i] as Match;
    memo1.Lines.Add(matchs.Value);
  end;  
end;
以上两中方法各有利弊,这里就懒的说了,自己试吧。
当然还有其他的方法,比如查找字符串中"href="的值,可以自己实现。

欢迎交流Email:sz319@163.com 主页:http://sz319.net.ru
转贴请保留此信息。

网学推荐

免费论文

原创论文

设为首页 | 加入收藏 | 论文首页 |原创论文 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师