Для примера использованы страницы следующих сайтов: Подари Жизнь (пример в файле); 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: help@podari-zhizn.ru
_result=string: info@podari-zhizn.ru
_result=string: pressa@podari-zhizn.ru
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/