Условное выполнение
Проверка условий
При работе с парсингом часто возникают ситуации, когда то или иное действие необходимо сделать в зависимости от определенного условия. Для проверки выполнения условия используется команда if. Эта команда работает со строками, целочисленными значениями и значениями с плавающей запятой. Команда работает со значением регистра (в нем должен находиться один из сравниваемых операндов), а потому может быть использована только в блоковом контексте.
В команде используются следующие параметры:
Параметр | Описание |
---|---|
match|eq|gt|lt|nlt | Режимы, в котором работает команда: match - проверяет содержит ли значение регистра переданный параметр; eq - проверяет равно ли переданное значение значению в регистре; gt - проверяет больше ли значение регистра чем переданный параметр; lt - проверяет меньше ли значение регистра чем переданный параметр; nlt - проверяет не меньше ли значение регистра чем переданный параметр. |
type | Тип значений для сравнения: string - для сравнения строковых значений; int - для сравнения целочисленных значений; float - для стравнения значений с плавающей запятой. Если параметр не передан, используется string. |
do | Блок команд для выполнения, если условие выполняется. Опциональный параметр. |
else | Блок команд для выполнения, если условие не выполняется. Опциональный параметр. |
Варианты записи команды if:
# СРАВНЕНИЕ С ПОМОЩЬЮ РЕГУЛЯРНОГО ВЫРАЖЕНИЯ
- if:
match: regex
# ЕСЛИ ЕСТЬ СОВПАДЕНИЕ - ВЫПОЛНИТСЯ БЛОК `do`
do:
..
..
# ЕСЛИ НЕТ - ВЫПОЛНИТСЯ БЛОК `else`
else:
..
..
# СРАВНЕНИЕ С ПОМОЩЬЮ РЕГУЛЯРНОГО ВЫРАЖЕНИЯ
# НО ИСПОЛЬЗУЕТСЯ ТОЛЬКО `if`, БЕЗ БЛОКА `else`
# ТАК ЖЕ РАБОТАЕТ И В ДРУГИХ РЕЖИМАХ
- if:
match: regex
# ЕСЛИ ЕСТЬ СОВПАДЕНИЯ - ВЫПОЛНИТСЯ БЛОК `do`
do:
..
..
# СРАВНЕНИЕ С ПОМОЩЬЮ РЕГУЛЯРНОГО ВЫРАЖЕНИЯ
# НО ИСПОЛЬЗУЕТСЯ ТОЛЬКО БЛОК `else`
# ТАК ЖЕ РАБОТАЕТ И В ДРУГИХ РЕЖИМАХ
- if:
match: regex
# ЕСЛИ НЕТ СОВПАДЕНИЯ - ВЫПОЛНИТСЯ БЛОК `else`
else:
..
..
# СРАВНЕНИЕ ЦЕЛОЧИСЛЕННЫХ ЗНАЧЕНИЙ
- if:
eq: 0
# ЕСЛИ ЕСТЬ СОВПАДЕНИЕ ТО ВЫПОЛНИТСЯ БЛОК `do`
type: int
do:
..
..
# ЕСЛИ НЕТ - ВЫПОЛНИТСЯ БЛОК `else`
else:
..
..
# СРАВНЕНИЕ ЦЕЛОЧИСЛЕННЫХ ЗНАЧЕНИЙ
- if:
gt: 0
type: int
# ЕСЛИ ЗНАЧЕНИЕ БОЛЬШЕ ЧЕМ ТО ЧТО УКАЗАНО В `gt` ТО ВЫПОЛНИТСЯ БЛОК `do`
do:
..
..
# ЕСЛИ НЕТ - ВЫПОЛНИТСЯ БЛОК `else`
else:
..
..
- if:
lt: 0
type: int
# ЕСЛИ ЗНАЧЕНИЕ МЕНЬШЕ ЧЕМ ТО ЧТО УКАЗАНО В `lt` ТО ВЫПОЛНИТСЯ БЛОК `do`
do:
..
..
# ЕСЛИ НЕТ - ВЫПОЛНИТСЯ БЛОК `else`
else:
..
..
- if:
nlt: 0
type: int
# ЕСЛИ ЗНАЧЕНИЕ БОЛЬШЕ ИЛИ РАВНО ЧЕМ ТО ЧТО УКАЗАНО В `nlt` ТО ВЫПОЛНИТСЯ БЛОК `do`
do:
..
..
# ЕСЛИ НЕТ - ВЫПОЛНИТСЯ БЛОК `else`
else:
..
..
Рассмотрим различные примеры использования оператора if и для этих целей возьмем следуюший HTML код:
<ul class="list">
<li class="list-item" id="1">Some text</li>
<li class="list-item" id="item=2"><a href="http://somesite.com/">Link</a></li>
<li class="list-item" id="item=3">Some other text</li>
</ul>
Пример работы режима match:
# НАЙДЕМ ВСЕ `li`
- find:
path: li
do:
- parse
# ПРОВЕРИМ ЕСТЬ ЛИ В ТЕКСТЕ СЛОВО `text`
- if:
match: text
do:
# ECЛИ ЕСТЬ ЗАПИШЕМ В ОБЪЕКТ
- object_field_set:
object: someobj
field: somefield
# НАЙДЕМ ВСЕ `li`
- find:
path: li
do:
- parse
# ПРОВЕРИМ ЕСТЬ ЛИ В ТЕКСТЕ СЛОВО `text`
- if:
match: text
# ЕСЛИ НЕТ НАЙДЕМ `a`
else:
- find:
path: a
do:
# ПОМЕСТИМ В РЕГИСТР АТРИБУТ `href`
- parse:
attr: href
# НОРМАЛИЗУЕМ ССЫЛКУ
- normalize:
routine: url
# ПЕРЕЙДЕМ ПО НЕЙ
- walk:
to: value
do:
..
..
# НАЙДЕМ ВСЕ `li`
- find:
path: li
do:
- parse
# ПРОВЕРИМ ЕСТЬ ЛИ В ТЕКСТЕ СЛОВО `text`
- if:
match: text
do:
# ECЛИ ЕСТЬ ЗАПИШЕМ В ОБЪЕКТ
- object_field_set:
object: someobj
field: somefield
# ЕСЛИ НЕТ НАЙДЕМ `a`
else:
- find:
path: a
do:
# ПОМЕСТИМ В РЕГИСТР АТРИБУТ `href`
- parse:
attr: href
# НОРМАЛИЗУЕМ ССЫЛКУ
- normalize:
routine: url
# ПЕРЕЙДЕМ ПО НЕЙ
- walk:
to: value
do:
..
..
Примеры работы режимов gt, lt, nlt, eq:
# НАЙДЕМ ВСЕ `li`
- find:
path: li
do:
# ПОМЕСТИМ В РЕГИСТР АТРИБУТ `id`, ПРЕДВАРИТЕЛЬНО ОЧИСТИВ ОТ ТЕКСТА
- parse:
attr: id
filter:
- (\d+)
# ПРОВЕРИМ БОЛЬШЕ ЛИ ЗНАЧЕНИЕ В РЕГИСТРЕ ЧЕМ `2`
- if:
gt: 2
# ЯВНО УКАЖЕМ ТИП `integer`
type: int
do:
# ECЛИ ЗНАЧЕНИЕ В РЕГИСТРЕ БОЛЬШЕ ЧЕМ `2` ЗАПИШЕМ В ОБЪЕКТ
- object_field_set:
object: someobj
field: somefield
# НАЙДЕМ ВСЕ `li`
- find:
path: li
do:
# ПОМЕСТИМ В РЕГИСТР АТРИБУТ `id`, ПРЕДВАРИТЕЛЬНО ОЧИСТИВ ОТ ТЕКСТА
- parse:
attr: id
filter:
- (\d+)
# ПРОВЕРИМ МЕНЬШЕ ЛИ ЗНАЧЕНИЕ В РЕГИСТРЕ ЧЕМ `2`
- if:
lt: 2
# ЯВНО УКАЖЕМ ТИП `integer`
type: int
do:
# ECЛИ ЗНАЧЕНИЕ В РЕГИСТРЕ БОЛЬШЕ ЧЕМ `2` ЗАПИШЕМ В ОБЪЕКТ
- object_field_set:
object: someobj
field: somefield
# НАЙДЕМ ВСЕ `li`
- find:
path: li
do:
# ПОМЕСТИМ В РЕГИСТР АТРИБУТ `id`, ПРЕДВАРИТЕЛЬНО ОЧИСТИВ ОТ ТЕКСТА
- parse:
attr: id
filter:
- (\d+)
# ПРОВЕРИМ НЕ МЕНЬШЕ ЛИ ЗНАЧЕНИЕ В РЕГИСТРЕ ЧЕМ `2` (БОЛЬШЕ ИЛИ РАВНО `2`)
- if:
nlt: 2
# ЯВНО УКАЖЕМ ТИП `integer`
type: int
do:
# ECЛИ ЗНАЧЕНИЕ В РЕГИСТРЕ БОЛЬШЕ ИЛИ РАВНО `2` ЗАПИШЕМ В ОБЪЕКТ
- object_field_set:
object: someobj
field: somefield
# НАЙДЕМ ВСЕ `li`
- find:
path: li
do:
# ПОМЕСТИМ В РЕГИСТР АТРИБУТ `id`, ПРЕДВАРИТЕЛЬНО ОЧИСТИВ ОТ ТЕКСТА
- parse:
attr: id
filter:
- (\d+)
# ПРОВЕРИМ ЗНАЧЕНИЕ В РЕГИСТРЕ НА РАВЕНТСВО С `2`
- if:
eq: 1
# ЯВНО УКАЖЕМ ТИП `integer`
type: int
else:
# ECЛИ ЗНАЧЕНИЕ В РЕГИСТРЕ НЕ РАВНО `2` ЗАПИШЕМ В ОБЪЕКТ
- object_field_set:
object: someobj
field: somefield
В следующей главе вы научитесь использовать оптическое распознавание текста в изображении.