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