Условное выполнение

Проверка условий

При работе с парсингом часто возникают ситуации, когда то или иное действие необходимо сделать в зависимости от определенного условия. Для проверки выполнения условия используется команда 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
              

В следующей главе вы научитесь использовать оптическое распознавание текста в изображении.