如何从Delphi获取网站标题?
答
您可以使用InternetOpenUrl
和InternetReadFile
函数获取网页的内容,然后查找<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://*.com/questions/4966888/how-to-get-website-title-from-delphi'));
Writeln(GetHTMLTitle('http://www.google.com/'));
Writeln(GetHTMLTitle('http://*.com/questions/tagged/delphi'));
Readln;
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
end.
答
您还可以使用Indy TIdHTTP组件,并在回答中使用与RRUZ相同的方法。
答
这完全取决于网站如何设置标题。
的<title>
标签是不是唯一的方法,你也有JavaScript等
最好是封装网页在Web浏览器(例如在TWebBrowser
),然后从那里抢到了冠军。
This page有一些线索。
--jeroen
答
与厄的想法继续,使类似的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;
问候
答
我有一个解析器(ATagParser),使这种事情微不足道。这是一个商业产品,但几年前我就把它推出市场。我仍然积极地使用它并开发它,并将它发送给任何询问的人。只要给予信贷,它就可以用于个人或商业用途。
BTW,发现与POS标签的想法都很好,但它会错过标题标签与属性 - 是的,标题标签可以有属性(DIR,郎等)
会在给出的其他选项中失败。
使用Pos(Ex)进行简单搜索可能会返回错误的结果,例如如果标题标签被注释掉。 – 2011-02-11 10:20:12
+1原生Windows API。 “我喜欢”。 (虽然`InternetCloseHandle`应该可能被包含在`finally`块中,对吧?) – 2011-02-11 11:30:29