Парсинг XML/HTML Free Pascal библиотека Internet Tools. Часть 2

Данный документ является продолжением первой части.

Для примера использованы страницы следующих сайтов: Подари Жизнь (пример в файле); Auto.ru (пример в файле)

Все примеры будут изучены в программе htmlparserExampleGui, её описание есть в первой части. Так как страницы разные, то примеры будут рассмотрены в двух разделах.

Анализ сайта "Подари Жизнь"

После того как скачаете файл примера, его содержимое необходимо ввести в программу htmlparserExampleGui (текстовое поле HTML-file). Все шаблоны запросов (template) вводятся в текстовое поле "Template".

1. Запрос на получение всех email (без mailto:), которые содержат домен podari-zhizn.ru:

<body template:optional="true">
<a t:condition="starts-with(@href,'mailto:') and ends-with(@href,'podari-zhizn.ru')">
  *{substring(@href,8)}
</a>
</body>

Ответ программы:

_result=string: [email protected]
_result=string: [email protected]
_result=string: [email protected]

 

2. Запрос на получение всех файлов стилей (тип text/css):

<head template:optional="true">
<link type="text/css">*{@href}</link>
</head>

Ответ программы:

_result=node(): /profiles/openatrium/modules/contrib/codefilter/codefilter.css?C
_result=node(): /sites/default/files/css/css_5690b9249b3202fb8ab38566d5a8e1b2.css
_result=node(): /sites/default/files/css/css_3b72895d934cac669de6f3f7d4337553.css
_result=node(): /sites/default/files/css/css_acd1ab1c782f92238f80bc1c99115d6d.css

 

3. Следующий запрос вычисляет сколько элементов div c классом block:

<t:s>$tmp:=0</t:s>
<body template:optional="true">
  <div class="block">*{$tmp:=$tmp+1}</div>
</body>
<t:s>$count:=$tmp</t:s>

Результат необходимо обрабатывать, значение поля count:

tmp=integer: 0
tmp=integer: 1
tmp=integer: 2
tmp=integer: 3
tmp=integer: 4
tmp=integer: 5
tmp=integer: 6
count=integer: 6

 

4. Запрос на получение всех внутренних ссылок в элементе div с class="block" (ссылки начинающиеся с "/"):

<div class="block" template:optional="true">
  <a t:condition="starts-with(@href,'/')">*{@href}</a>
</div>

Ответ:

_result=node(): /main/user

 

5. Получить содержимое всех тэгов h2, после первого тэга h2 в документе:

<body template:optional="true">
  <h2 />
  <h2>*{.}</h2>
</body>

Ответ:

_result=node(): Наши задачи
_result=node(): Наша история

 

6. Получить все ссылки из строк в таблице с id="attachments", с которыми в ячейке size указано словосочетание "МБ":

<table template:optional="true" id="attachments">
  <tr><td><a>{@href}</a></td><td class="size" t:condition="ends-with(.,'МБ')" /></tr>*
</table>

Результат вернет ссылки которым размер указан с "МБ":

_result=node(): http://podari-zhizn.ru/sites/default/files/report2011.pdf
_result=node(): http://podari-zhizn.ru/sites/default/files/minyust2010-02.pdf
_result=node(): http://podari-zhizn.ru/sites/default/files/minyust2010-01.pdf
_result=node(): http://podari-zhizn.ru/sites/default/files/minyust2009-02.pdf
_result=node(): http://podari-zhizn.ru/sites/default/files/minyust2009-01.pdf
_result=node(): http://podari-zhizn.ru/sites/default/files/minyust2008-02.pdf
_result=node(): http://podari-zhizn.ru/sites/default/files/minyust2008-01.pdf
_result=node(): http://podari-zhizn.ru/sites/default/files/minyust2007-02.pdf
_result=node(): http://podari-zhizn.ru/sites/default/files/minyust2007-01.pdf

 

7. Как получить комментарии в документе? Необходимо указывать XPath выражение //comment():

<html t:optional="true">
{//comment()}
</html>

Ответ программы:

_result=sequence: (node(): // header, node(): // header top, node(): // navigation, node(): // site-header-wrapper site-header, node(): //content page-region, node(): //right page-region, node(): //page, node(): //footer limiter)

 

8. Получить список атрибутов  id во всех элементах input c типом hidden, которые располагаются ниже элемента div с id="footer":

<div id="footer" />
<input type="hidden">*{@id}</input>

Ответ:

_result=node(): edit-details-sid
_result=node(): edit-details-page-num
_result=node(): edit-details-page-count
_result=node(): edit-details-finished
_result=node(): form-28DmlVOopCz-nZFWp_wZahwiDy5xv29tmYzeEtNRu64
_result=node(): edit-webform-client-form-20986

 

9. Задача получить адреса всех внешних ссылок, т.е. ссылки которые не относятся к домену http://podari-zhizn.ru и не являются адресами email:

<t:loop>
<a t:condition="not(starts-with(@href,'/') or starts-with(@href,'http://podari-zhizn.ru')
                 or starts-with(@href,'mailto:'))">
  {@href}
</a>
</t:loop>

Ответ:

_result=node(): http://givelifenow.co.uk/
_result=node(): http://www.podari-zhizn.ru
_result=node(): http://qweo.ru/#podari_zhizn
_result=node(): http://www.facebook.com/podarizhizn
_result=node(): http://vk.com/podaryzhizn
_result=node(): http://www.twitter.com/podarizhizn
_result=node(): http://podari-zhizn.livejournal.com
_result=node(): http://www.youtube.com/user/fondpodarizhizn
_result=node(): http://ok.ru/group/52659580764321

 

Анализ сайта "Auto.ru"

Скачайте файл пример для сайта auto.ru, вставьте содержимое в программу.

1. Получить значения для нескольких полей Value с учётом нескольких марок автомобилей:

<t:loop>
<select name="mark_id">
  <option t:condition=".='Chevrolet'">{"Шевроле: "||@value}</option>
  <option t:condition=".='Ford'">{"Форд: "||@value}</option>
  <option t:condition=".='Nissan'">{"Ниссан: "||@value}</option>
</select>
</t:loop>

Результат. Выведены данные Value только некоторых авто:

_result=string: Шевроле: 49
_result=string: Форд: 82
_result=string: Ниссан: 191

 

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

<t:loop>
<h1>Продажа авто в России</h1>
<a name="nissan">{@href}</a>
<a name="chevrolet">{@href}</a>
<a name="ford">{@href}</a>
</t:loop>

Ответ:

_result=node(): /cars/nissan/all/
_result=node(): /cars/chevrolet/all/
_result=node(): /cars/ford/all/

 

3. Найти ссылку с определенным текстом и получить классы его родительского элемента li:

<li class={.}>
<a>О проекте</a>
</li>

Ответ: 

_result=node(): footer-nav-c footer-nav-c_about

 

4. Найти ссылку с определенным текстом и получить имена всех её атрибутов:

<t:loop>
<a *={name()}>Vkontakte</a>
</t:loop>

Ответ:

_result=sequence: (string: class, string: href, string: target)

 

5. Найти ссылку с адресом и получить её текст:

<t:loop>
<a href="https://auto.yandex.ru/">{.}</a>
</t:loop>

Ответ:

_result=node(): Яндекс.Авто

 

6. Получить адреса ссылок в списке ul, которому предшествует элемент div с текстом:

<div class="footer-nav-n">Продажа</div>
<ul>
<a>*{@href}</a>
</ul>

Ответ:

_result=node(): http://auto.ru/
_result=node(): http://trucks.auto.ru/
_result=node(): http://moto.auto.ru/