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

четверг, 28 августа 2008 г.

Получение содержимого web-страниц в Delphi. Вариант первый, самый простой

Пытаюсь излагать все последовательно и небольшими порциями. Повторюсь: рассчитываю, что по моим инструкциям начать работу над собственным парсером смогут даже новички.

Сегодня опишу самый простой способ получить содержимое web-страницы. Для этого будем использовать стандартный Active-X компонент TWebBrowser. Этот же компонент использует Windows в своем IE. В некоторых случаях это даже удобно, так как созданный на основе этого компонента объект будет "видеть" все ваши IE-кукисы и прочие настройки (если, конечно, вы пользуетесь IE).

Итак, создадим форму, на нее поместим TEdit (подобие адресной строки), кнопку и компонент TWebBrowser (вкладка Internet).


В обработчике нажатия кнопки пишем:
WebBrowser1.Navigate(Edit1.Text);

Вот и все!

Simple Browser
Этот компонент удобен в случаях, когда HTML-код страницы нельзя получить другим простым способом (например, некоторые сайты отказываются работать, когда браузер не поддерживает flash, поэтому получить код страницы в обход применения этого компонента — возможности нет). Также TWebBrowser удобен для автоматизации работы с формами на сайтах.

Иногда требуется, чтобы страница полностью отобразилась в контейнере, прежде чем продолжится работа с ней. В этом случае я обычно в проекте создаю глобальную переменную, на событие OnDocumentComplete вешаю обработчик:
procedure TFMain.WebBrowser1DocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
begin
DocLoaded := true;
end;

А в теле основного модуля работа продолжается только тогда, когда эта глобальная переменная станет равна true:
procedure TFMain.PostMessageOnBoard(Mess: string);
var
Doc : IHTMLDocument2;
S : string;
begin
DocLoaded := false;
WebBrowser1.Navigate(Edit1.Text);
while DocLoaded = false do
Application.ProcessMessages;

Doc := WebBrowser1.Document as IHTMLDocument2;
WebBrowser1.OleObject.document.getElementById('shform').ClassName := '';

S := Doc.body.innerHTML;

//...
end;

Кстати, в приведенном выше отрезке кода содержится пример использования объектной модели браузера. (Что это — я расскажу позже.) А в переменной S в результате окажется весь HTML-код страницы.

В ближайших постах я планирую рассказать:
  • Что такое объектная модель браузера и с чем ее едят?
  • Как еще можно получить содержимое страницы?
  • Написание простенького парсера (Пример №1 - Парсинг ключевых слов).
Так что подписывайтесь на RSS :)

Статьи схожей тематики:



13 комментариев:

  1. А я делаю так:

    while WebBrowser.ReadyState<READYSTATE_COMPLETE
    do Application.ProcessMessages;

    ОтветитьУдалить
  2. Ну, по-хорошему, про использование Application.ProcessMessages вообще лучше забыть - дёргать странички в потоке с помощью WinInet и потом обрабатывать, но, цель поста была не в этом :)

    ОтветитьУдалить
  3. ругается на IHTMLDocument2.
    Неизвестный идентификатор

    ОтветитьУдалить
  4. >> S := Doc.body.innerHTML;

    в данном случае сохраняется только содержимое между тегами "body"

    я для сохранения использую
    S := WebBrowser.OleObject.document.all.tags('html').item(0).innerHTML;

    кстати при таком сохранении есть непонятный нюанс - происходит капитализация всех тегов
    как победить эту беду?

    ОтветитьУдалить
  5. Alex, я использую то, что мне надо :) Вы вправе сохранять так, как угодно вам.

    ОтветитьУдалить
  6. >я использую то, что мне надо
    согласен :-)

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

    ОтветитьУдалить
  7. подскажите плиз где взять и как добавить библиотеку MSHTML.

    ОтветитьУдалить
  8. Она, вроде, входит в базовую комплектацию. Надо просто добавить ее в uses.

    ОтветитьУдалить
  9. MSHTML - библиотека типов. нужно импортировать. в delphi 2010: меню Component / Import Component... /Import Type Library/Microsoft HTML Object Library

    в других дельфях не знаю, гугл в помощь

    ОтветитьУдалить
  10. Alex, спасобо за комментарий) Я в 10-ых делфях не работала, а семерке никакой импорт не требуется.

    ОтветитьУдалить
  11. могу ошибатся, но вроде и в делфи 7 нужно импортировать.
    файлик MSHTML_TLB.pas из ниоткуда не возьмется...

    ОтветитьУдалить
  12. Нет, в седьмых не надо, 100%. И там не MSHTML_TLB.pas, а MSHTML.pas.

    ОтветитьУдалить

Комментарии модерируются, вопросы не по теме удаляются, троллинг тоже.

К сожалению, у меня нет столько свободного времени, чтобы отвечать на все частные вопросы, так что, может, свой вопрос лучше задать на каком-нибудь форуме?

Поделиться