Поиск по блогу

Показаны сообщения с ярлыком объектная модель. Показать все сообщения
Показаны сообщения с ярлыком объектная модель. Показать все сообщения

пятница, 16 января 2009 г.

Когда на форме нет места TWebBrowser-у

Еще один пост из серии для начинающих осваивать работу с интернетом в среде 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.

суббота, 30 августа 2008 г.

Объектная модель браузера (DOM в веб-браузерах)

Немного об объектной модели браузера. Почему немного? Потому что этот блог посвящен все-таки созданию парсеров, а не изучению отдельных вопросов программирования.

В Википедии:
DOM (от англ. Document Object Model — «объектная модель документа») — это не зависящий от платформы и языка программный интерфейс, позволяющий программам и скриптам получить доступ к содержимому документов, а также изменять содержимое, структуру и оформление документов.

Суть объектной модели браузера в том, что мы через простой интерфейс можем получить доступ к любым элементам страницы. Например, к любой ссылке (или ко всему массиву ссылок), к любой форме, к любому элементу ввода, к любой кнопке и так далее. К объектам и их свойствам и методам, естественно. Нас больше всего будут интересовать объекты, связанные с тегами HTML. Они соответствуют тегам, которые формируют текущий документ, и включают такие элементы как гиперсвязи и формы.

К объектам можно обращаться по id, по номеру в массиве (например, если надо перебрать все элементы одинакового типа).

Я бы посоветовала взять в руки какой-нибудь толстенный спровочник по JavaScript, например. И просмотреть раздел, посвященный объектной модели браузера. В свое время я так и делала. Необязательно знать и помнить все объекты, свойства и методы — важно оценить возможности и прикинуть, для чего все это может пригодиться. Тем, кто уже изучал JavaScript, будет немного легче.

Так, сейчас немного о том, как работать с объектной моделью в Delphi, используя рассмотренный в предыдущем посте компонент TWebBrowser.

Существует интерфейс IHTMLDocument2, который позволяет с легкостью это делать. А можно напрямую через OleObject. Например, если в html-документе, заруженном в WebBrowser, есть, допустим, инпут с id='message', то код:
WebBrowser.OleObject.document.getElementById('message').Value := 'Привет!';
запишет в этот инпут строку "Привет!".

А код:
  ovElements := WebBrowser1.OleObject.Document.Forms.Item(0).Elements;
for i := 0 to (ovElements.Length-1) do
if (AnsiUpperCase(ovElements.Item(i).tagName) = 'INPUT') then
if (AnsiUpperCase(ovElements.Item(i).type) = 'SUBMIT') or
(AnsiUpperCase(ovElements.Item(i).type) = 'BUTTON') then
if (ovElements.item(i).Value = 'Send') then
ovElements.Item(i).Click;
переберет все элементы первой по счету формы страницы, найдет в ней кнопку, на которой будет написано "Send" и сымитирует ее нажатие.

Как видите, объектная модель — очень полезная и удобная штука. Хотя основное ее применение — не парсинг, а автоматизация регистраций, заполнения форм и так далее. Чтобы показать, насколько она может быть полезна, в следующих постах приведу пример разработки и создания небольшой утилиты для автоматизации добавления вашей RSS-ленты в RSS-агрегаторы.

Поделиться