2011-02-11 84 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,郎等)

會在給出的其他選項中失敗。