2011-02-11 133 views

回答

11

您可以使用InternetOpenUrlInternetReadFile函数获取网页的内容,然后查找<title>标记。

查看示例应用程序。

程序GetTitleHTML;

{$APPTYPE CONSOLE} 

uses 
    WinInet, 
    StrUtils, 
    SysUtils; 

function GetHTMLTitle(const Url:string):string; 
const 
BuffSize  = 64*1024; 
TitleTagBegin='<title>'; 
TitleTagEnd ='</title>'; 
var 
    hInter : HINTERNET; 
    UrlHandle: HINTERNET; 
    BytesRead: Cardinal; 
    Buffer : Pointer; 
    i,f  : Integer; 
begin 
    Result:=''; 
    hInter := InternetOpen('', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0); 
    if Assigned(hInter) then 
    begin 
    GetMem(Buffer,BuffSize); 
    try 
     UrlHandle := InternetOpenUrl(hInter, PChar(Url), nil, 0, INTERNET_FLAG_RELOAD,0); 
     try 
     if Assigned(UrlHandle) then 
     begin 
      InternetReadFile(UrlHandle, Buffer, BuffSize, BytesRead); 
      if BytesRead>0 then 
      begin 
      SetString(Result, PAnsiChar(Buffer), BytesRead); 
      i:=Pos(TitleTagBegin,Result); 
      if i>0 then 
      begin 
       f:=PosEx(TitleTagEnd,Result,i+Length(TitleTagBegin)); 
       Result:=Copy(Result,i+Length(TitleTagBegin),f-i-Length(TitleTagBegin)); 
      end; 
      end; 
     end; 
     finally 
     InternetCloseHandle(UrlHandle); 
     end; 
    finally 
     FreeMem(Buffer); 
    end; 
    InternetCloseHandle(hInter); 
    end 
end; 

begin 
    try 
    Writeln(GetHTMLTitle('http://stackoverflow.com/questions/4966888/how-to-get-website-title-from-delphi')); 
    Writeln(GetHTMLTitle('http://www.google.com/')); 
    Writeln(GetHTMLTitle('http://stackoverflow.com/questions/tagged/delphi')); 
    Readln; 
    except 
    on E:Exception do 
     Writeln(E.Classname, ': ', E.Message); 
    end; 
end. 
+0

使用Pos(Ex)进行简单搜索可能会返回错误的结果,例如如果标题标签被注释掉。 – 2011-02-11 10:20:12

+0

+1原生Windows API。 “我喜欢”。 (虽然`InternetCloseHandle`应该可能被包含在`finally`块中,对吧?) – 2011-02-11 11:30:29

0

您还可以使用Indy TIdHTTP组件,并在回答中使用与RRUZ相同的方法。

5

这完全取决于网站如何设置标题。

<title>标签是不是唯一的方法,你也有JavaScript等

最好是封装网页在Web浏览器(例如在TWebBrowser),然后从那里抢到了冠军。

This page有一些线索。

--jeroen

1

与厄的想法继续,使类似的RRUZ代码,用印(成分TidHTTP)相同的程序可以看到与此类似:

function GetHTMLTitle(const Url:string):string; 
const 
    TitleTagBegin='<title>'; 
    TitleTagEnd ='</title>'; 
var 
    idH:TidHTTP; 
    i,f:integer; 
begin 
    idH := TidHTTP.Create(); 
    try 
    Result := idH.Get(Trim(URL)); 

    // Search theTAGS 
    i:=Pos(TitleTagBegin,Result); 
    if i>0 then begin 
     f:=PosEx(TitleTagEnd,Result,i+Length(TitleTagBegin)); 
     Result:=Copy(Result,i+Length(TitleTagBegin),f-i-Length(TitleTagBegin)); 
    end; 
    finally 
    IdH.Free; 
    end; 
end; 

问候

0

我有一个解析器(ATagParser),使这种事情微不足道。这是一个商业产品,但几年前我就把它推出市场。我仍然积极地使用它并开发它,并将它发送给任何询问的人。只要给予信贷,它就可以用于个人或商业用途。

BTW,发现与POS标签的想法都很好,但它会错过标题标签与属性 - 是的,标题标签可以有属性(DIR,郎等)

会在给出的其他选项中失败。