如何从Delphi获得网站标题?

如何从Delphi获得网站标题?,delphi,Delphi,我不想用twebbrowser, 有人知道获取网站标题的其他方法吗?您可以使用和功能获取网页内容,然后查找标记 检查此示例应用程序 程序GetTitleHTML {$APPTYPE CONSOLE} uses WinInet, StrUtils, SysUtils; function GetHTMLTitle(const Url:string):string; const BuffSize = 64*1024; TitleTagBegin='<title>';

我不想用twebbrowser,
有人知道获取网站标题的其他方法吗?

您可以使用和功能获取网页内容,然后查找
标记

检查此示例应用程序

程序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.
{$APPTYPE控制台}
使用
温妮特,
支柱,
SysUtils;
函数GetHTMLTitle(constURL:string):string;
常数
BuffSize=64*1024;
TitleTagBegin='';
TitleTagEnd='';
变量
腹地:腹地网;
UrlHandle:HINTERNET;
拜特斯拉德:红衣主教;
缓冲区:指针;
i、 f:整数;
开始
结果:='';
提示:=互联网开放(“”,互联网开放类型,无,无,0);
如果指定(提示),则
开始
GetMem(缓冲区,BuffSize);
尝试
UrlHandle:=InternetOpenUrl(提示,PChar(Url),无,0,互联网标志重新加载,0);
尝试
如果已分配(UrlHandle),则
开始
InternetReadFile(URL句柄、缓冲区、BuffSize、字节读取);
如果字节读取>0,则
开始
设置字符串(结果、平移(缓冲区)、字节读取);
i:=位置(标题标记开始,结果);
如果i>0,那么
开始
f:=PosEx(TitleTagEnd,Result,i+长度(TitleTagBegin));
结果:=复制(结果,i+长度(TitleTagBegin),f-i-长度(TitleTagBegin));
结束;
结束;
结束;
最后
InternetCloseHandle(UrlHandle);
结束;
最后
FreeMem(缓冲区);
结束;
InternetCloseHandle(暗示);
结束
结束;
开始
尝试
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;
除了
关于E:Exception-do
Writeln(E.Classname,“:”,E.Message);
结束;
结束。

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

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

标记不是唯一的方法,您还有JavaScript等等

最好是将页面封装在web浏览器中(例如
TWebBrowser
),然后从中获取标题

有一些线索


--jeroen

继续使用birger的思想,并使用Indy(组件TidHTTP)使代码类似于RRUZ。相同的例程可以看到类似的内容:

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;
函数getHtmlTile(constURL:string):string; 常数 TitleTagBegin=''; TitleTagEnd=''; 变量 idH:TidHTTP; i、 f:整数; 开始 idH:=TidHTTP.Create(); 尝试 结果:=idH.Get(Trim(URL)); //搜索标签 i:=位置(标题标记开始,结果); 如果i>0,则开始 f:=PosEx(TitleTagEnd,Result,i+长度(TitleTagBegin)); 结果:=复制(结果,i+长度(TitleTagBegin),f-i-长度(TitleTagBegin)); 结束; 最后 IdH.免费; 结束; 结束; 关于

我有一个解析器(ATagParser),它使这种事情变得微不足道。这是一种商业产品,但几年前我就把它从市场上抢走了。我仍在积极地使用和开发它,并将它发送给任何要求的人。只要提供信用,它可以用于个人或商业用途

顺便说一句,用POS查找标签的想法很好,但是它会错过带有属性的标题标签——是的,标题标签可以有属性(dir、lang等)


将在给定的其他选项中失败。

下面的功能也可以检测类似的标题

<title class="notranslate">Title</title>
标题
以下是函数:

function GetHTMLTitle(const HTML:string):string;
var
  tagstart: int64;
  tagstop: int64;
  titlestop: int64;
  temp:string;
  titletext: string;
begin
  Result:='';
  tagstart:=pos('<title',lowercase(html));
  if tagstart>0 then
  begin
    temp:=copy(html,tagstart);
    tagstop:=pos('>',temp);
    if tagstop>0 then
    begin
      temp:=copy(temp,tagstop+1);
      titlestop:=pos('</title>',lowercase(temp));
      if titlestop>0 then
      begin
        titletext:=copy(temp,1,titlestop-1);
        Result:=titletext;
      end;
    end;
  end;
end;
函数getHtmlTile(constHTML:string):string; 变量 tagstart:int64; tagstop:int64; 标题:int64; temp:字符串; titletext:字符串; 开始 结果:=''; 标记开始:=位置('',温度); 如果标记停止>0,则 开始 温度:=复制(温度,标记停止+1); titlestop:=pos(“”,小写(temp)); 如果titlestop>0,则 开始 titletext:=副本(临时,1,titlestop-1); 结果:=滴定文本; 结束; 结束; 结束; 结束;
使用Pos(Ex)进行简单搜索可能会返回错误的结果,例如,如果标题标记被注释掉。+1本机Windows API。“我喜欢”。(尽管
InternetCloseHandle
可能应该包含在
finally
块中,对吧?)请注意不要假设您可以访问哪些站点/页面。仅仅因为用户可以进入他们的facebook、gmail、wallstreetjournal等,并不意味着你也可以这样做,而无需身份验证。@TOndrej,我同意你关于使用Pos(Ex)功能的评论,我认为获得更可靠结果的唯一方法是使用
HTML解析器
,这只是一个基本示例;)@克里斯:这是使用TWebBrowser(或封装其他网络浏览器,如firefox或chrome)的另一个原因。因此我的答案是:-)Thx。不管你喜欢与否,在网页上编写脚本是一种趋势。无法获取此标题