Delphi. Парсинг с помощью библиотеки MSHTML

В данном посте учусь решать типичные задачи парсинга, используя библиотеку MSHTML – искать ссылки, заголовки, мета-теги, выделять другие элементы HTML страницы. Для примера буду просто выгружать найденное в Memo. Работаем в FireMonkey.

Подготовительная работа

О том как загрузить страницу я писал в предыдущих постах.

Как загрузить страницу? (В данном посте будем использовать способ №2 так как работаем с MSHTML).

Также, возможно Вам понадобится пост

Как победить глюк всплывающего окна?

В результате загрузки страницы мы получим глобальную интерфейсную переменную idoc:IHTMLDocument2C ней-то и будем работать в данном посте. 

 

Загрузка страницы

Через интерфейс IHTMLDocument2

 Как получить список имен всех тегов?

В предыдущем посте, я уже рассматривал как получить список имен всех тегов,

Но, на мой взгляд это достаточно длинно. Можно слегка укоротить. В данном посте, я уже больше разобрался и предлагаю более короткий код.

18

Как получить список ссылок?

Универсальный код

Под универсальностью я понимаю то, что можно получать не только теги ссылок ‘A’, но и любые другие теги ‘div’ ‘p’ и так далее.

10

 

Здесь мы вытащили атрибут href, можно вытащить таким образом любой атрибут! А можно и просто innerHTML outerHTML innerText outerText и так далее.

Вообще говоря, таким образом можно получить любой атрибут любого тега! Функция getAttribute() достаточно универсальная. Можно, например искать элемент по ID таким образом…

Ниже я приведу пример как получить элемент по ID, а сейчас пока займемся другими вопросами.

Альтернативный более короткий код. Как получить список ссылок?

Для element  можно выводить outerHTML innerHTML, а можно обратиться к атрибуту методом element.getAttribute() как в примере выше. Словом дальнейший код уже зависит от задачи. IDE сама все подскажет, что можно вытащить из element, просто нажмите точку и увидите выпадающий список… Ну а дальше – экспериментируйте и подстраивайтесь под задачу.

17

Как получить список заголовков H1-H5?

11

 

Как получить содержимое мета-тегов?

12

Альтернативный код – как получить содержимое мета-тегов?

Допустим мы исследовали некоторую страницу, скажем http://www.vesti.ru/ и в коде страницы увидели что-то вроде…

Допустим, нам нужно сначала найти все теги со значением

И вытащить оттуда содержание атрибута content… то есть, в выше приведенном участке кода нам нужно вытащить значение IE=edge.

В этом случае можно воспользоваться не универсальным способом, а специальным интерфейсом для мета-тегов IHTMLMetaElement. Вообще, с опытом использование специальных интерфейсов сильно упрощает задачу.

Как получить подписи рисунков?

Этот материал на основе поста Влада с блога WebDelphi. Я лишь повторяю его здесь, чтобы проверить и закрепить свои знания.

14

Альтернативный, более короткий код

Продолжаем с картинками. Получение OuterHTML для тегов IMG

Как получить элемент по ID?

15

 

Альтернативный, более короткий путь – как получить элемент по ID

 

Как получить Body?

Как получить текст из Body без тегов?

Как получить Title?

Эта библиотека просто огромна!!! В ней очень много возможностей, можно по аналогии получать скрипты, анкоры, все, что находится внутри документа HTML можно вытащить с помощью библиотеки MSHTML. Моей целью было разобраться на примерах как это работает, далее я сделаю обобщающие выводы, и на этом тему парсинга HTML буду заканчивать. Останется только разобраться с тем, что такое innerHTML outer HTML innerText outerText, а также с тем, как заменять содержание тегов. Но это в других постах.

Выводы

Видно, что после того как мы загрузили страницу в интерфейсную переменную, у нас получилось как минимум 3 пути дальнейшей работы.

1 Путь простой универсальный – обращаемся к idoc.all

Все HTML элементы хранятся в idoc.all Cледовательно, можно обратиться к любому из них по названию тега, например, то есть так… …на примере парсинга ссылок…

Можно обратиться к элементу по ID

Работа с idoc напрямую

Касаясь нашего примера – мы создали интерфейсную переменную idoc. Многие элементы хранятся не в idoc.all, а напрямую в idoc, например

И так далее…. Чтобы ознакомиться с этим списком, достаточно после получения idoc в редакторе IDE DELPHI, в обработчике кнопки, например, набрать idoc, набрать точку, и дождаться выпадения списка

19

 

И далее, работать можно таким образом… …на примере парсинга ссылок

 

2 путь – создание предварительной коллекции

На примере поиска ссылок

3 Путь – с использованием iDispatch

На примере поиска по ID

На этом, думаю, пора данный пост закончить. Удачи в разработке!!!

Исходники

198 Getting_all_tags

This entry was posted in Delphi, MSHTML, Без рубрики, Парсинг and tagged . Bookmark the permalink.