如何从Delphi获得网站标题?
我不想用twebbrowser,如何从Delphi获得网站标题?,delphi,Delphi,我不想用twebbrowser, 有人知道获取网站标题的其他方法吗?您可以使用和功能获取网页内容,然后查找标记 检查此示例应用程序 程序GetTitleHTML {$APPTYPE CONSOLE} uses WinInet, StrUtils, SysUtils; function GetHTMLTitle(const Url:string):string; const BuffSize = 64*1024; TitleTagBegin='<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.
{$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。不管你喜欢与否,在网页上编写脚本是一种趋势。无法获取此标题