Еще один пост из серии для начинающих осваивать работу с интернетом в среде Delphi.
Как вы уже поняли, работать с
DOM html-страницы гораздо удобнее, чем работать непосредственно с html с помощью регулярных выражений. Но компонент TWebBrowser на форме нам совсем не нужен. Можно просто скачать страницу, а потом создать экземпляр класса
coHTMLDocument и работать с ним.
Код, иллюстрирующий сказанное:
uses
... MSHTML, UrlMon, activex;
function DownloadFile(SourceFile, DestFile: string): Boolean;
begin
try
Result := UrlDownloadToFile(nil, PChar(SourceFile), PChar(DestFile), 0,
nil) = 0;
except
Result := False;
end;
end;
procedure TMainF.cxButton1Click(Sender: TObject);
var
sFileName : string;
i: integer;
v : OleVariant;
Doc : IHTMLDocument2;
DocAll,
DocA : IHTMLElementCollection;
AParentElement,
DocElement : IHtmlElement;
SLBody : TStringList;
begin
// загружаем страницу
try
SLBody:=TStringList.Create;
sFileName:=ExtractFilePath(Application.ExeName) + 'cache.txt';
if DownloadFile(RegionURL,sFileName) then
SLBody.LoadFromFile(sFileName);
DeleteFile(sFileName);
Doc := coHTMLDocument.Create as IHTMLDocument2;
if Doc = nil then
begin
ShowMessage('Ошибка создания IHTMLDocument2');
exit;
end;
v := VarArrayCreate([0,0],VarVariant);
v[0] := SLBody.Text;
Doc.write(PSafeArray(TVarData(v).VArray));
DocAll := Doc.all;
DocA := DocAll.Tags('A') as IHTMLElementCollection;
for i := 0 to DocA.length-1 do
begin
DocElement := DocA.Item(i, 0) as IHtmlElement;
AParentElement := DocElement.parentElement;
if LowerCase(AParentElement.tagName) = 'li' then
begin
S := DocElement.innerHTML + ' ['+ DocElement.getAttribute('href',0) +']';
mRequest.Lines.Add(S);
end;
end;
finally
begin
SLBody.Free;
Doc.Close;
Doc := nil;
end;
end;
end;
Как видите, все просто.
В примере показана работа с атрибутом href ссылки. Отличие от работы с атрибутом href ссылок кода, предварительно загруженного в TWebBrowser, будет состоять в том, что относительные ссылки отражаются немного по-другому. Например, если в коде есть ссылка "
href=/?region=1", то результатом кода
DocElement.getAttribute('href',0)
будет "
about:blank/?region=1". Это связано с тем, что страницей по умолчанию объекта является
about:blank. Но это не страшно. Можно их обработать и привести к нужному виду.
Удачных разработок!
___
А сама я помимо программирования решила попробовать поработать с биржей ссылок
Nahaa.ru. Если еще не знаете, что это такое и с чем это едят, то можете почитать
историю о моем освоении этого сервиса.
Чтобы быть в курсе обновлений блога, можно
подписаться на RSS.