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

суббота, 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-агрегаторы.

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



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

  1. Читаю Ваш блог с самого начала ( в смысле с первого поста) - все понятно и легко. Спасибо за блог. :)

    ОтветитьУдалить
  2. Да, мегаполезный блог... хоть сам на с++ пишу )))

    ОтветитьУдалить
  3. Очень полезная информация ^_^
    Прямо сейчас сижу и пробую все это исполнить на C#.

    ОтветитьУдалить
  4. Подскажите, а как можно программно щелкнуть вот в такой строчке
    div class="action unavailable"
    span onclick="doOperation(this, 38)" class="bathe fleas tooltip"

    ОтветитьУдалить
  5. Анонимный, может, вам поможет вот эта статья: http://parsing-and-i.blogspot.com/2009/02/javascript-twebbrowser-delphi.html.

    ОтветитьУдалить
  6. А как нажать на кнопку вида: div class="word-submit">Добавить /div>?

    ОтветитьУдалить
  7. Человеки, здравствуйте! помогите, пожалуйста, мне нужна программа для вытаскивания DOM со страницы. Сам пытаюсь разобраться, но ни как не получается. может кто нить помочь с этим? если что мое мыло damir89.mail@mail.ru

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

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

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

Поделиться