Методы для работы с регистром

Parse

С помощью команды parse вы можете извлекать данные из текущего блока и записывать их в регистр. В дальнейшем эти данные могут быть изменены, нормализованы, записаны в переменные или в поля объектов.

Обратите внимание!
Parse всегда возвращает какое-то значение в регистр, или пустую строку, если в блоке нет контента для извлечения. Команда может возвращать текстовый или HTML контент блока, а также значение аттрибута текущего HTML элемента (корневого элемента блока).

Примеры записи в коде:

          - find:
    path: a.somepath
    do:
    # ПАРСИМ ТЕКСТОВЫЙ КОНТЕНТ ВЫБРАННОГО БЛОКА
    - parse

    # ПАРСИМ АТТРИБУТ `href` НАЙДЕННОГО ЭЛЕМЕНТА `a`
    - parse:
        attr: href

    # ПАРСИМ HTML КОНТЕНТ ВЫБРАННОГО БЛОКА
    - parse:
        format: html
          
          # ИСПОЛЬЗУЕМ ФИЛЬТРЫ (РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ) ДЛЯ ИЗВЛЕЧЕНИЯ НУЖНОГО ФРАГМЕНТА ДАННЫХ
- find:
    path: .somepath
    do:
    - parse:
        filter:
        - .+=(\d+)
        - (.+)

- find:
    path: .somepath
    do:
    - parse:
        attr: class
        filter:
        - .+=(\d+)
        - (.+)
          

Команда parse поддерживает следующие параметры:

Параметр Описание
format Формат извлеченных данных, text или html. Если параметр не передан, будет извлечен текст.
attr Если передан, будет извлечено значение аттрибута корневого тега текущего блока, имя которого передано в параметре. Если не передан - будет извлечен весь контент блока.
filter Одно или несколько регулярных выражений для извлечения только определенных данных из контента. Извлекаемые данные должны быть заключены в круглые скобки внутри регулярного выражения (определены как группа). Если указано несколько регулярных выражений, то они используются по порядку пока не будет извлечена не пустая строка используя текущий фильтр.
joinby Значение этого параметра используется для соединения найденных фильтром групп. Если параметр отсутствует и фильтр найдет несколько групп, то они будут соединены пустой строкой.

Теперь давайте рассмотрим более детальные примеры использования команды parse. В качестве данных возмем фрагмент 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>
          

Варианты использования команды:

              # НАЙДЕМ `ul` И ЗАПОЛНИМ РЕГИСТР ЕГО СОДЕРЖИМЫМ
- find:
    path: .list
    do:
    - parse
    # В РЕГИСТРЕ НАХОДИТСЯ "Some textLinkSome other text"
              
              # НАЙДЕМ `a` И ЗАПОЛНИМ РЕГИСТР ЗНАЧЕНИЕМ АТТРИБУТА `href`
- find:
    path: .list-item > a
    do:
    - parse:
        attr: href
    # В РЕГИСТРЕ НАХОДИТСЯ "http://somesite.com/"
                            
              # НАЙДЕМ `ul` И ЗАПОЛНИМ РЕГИСТР ЕГО html-содержимым
- find:
    path: ul
    do:
    - parse:
        format: html
    # В РЕГИСТРЕ НАХОДИТСЯ
    # <li class="list-item" id="1" >Some text</li>
    # <li class="list-item" id="2"><a href="http://somesite.com/">Link</a></li>
    # <li class="list-item" id="3" >Some other text</li>
                
              # ФИЛЬТР ПО ТЕКСТУ
- find:
    path: .list-item
    do:
    - parse:
        filter:
        - Some\s*(\S+)\s*text
    # ДЛЯ ПЕРВЫХ ДВУХ `li` ФИЛЬТР НЕ НАЙДЕТ СОВПАДЕНИЙ И КОМАНДА ВЕРНЕТ ПУСТУЮ СТРОКУ ("")
    # НО ДЛЯ ПОСЛЕДНЕГО ВЕРНЕТ "other"

# НАЙДЕМ `li` И ЗАПОЛНИМ РЕГИСТР ТОЛЬКО ЦИФРОЙ ИЗ АТРИБУТА `id`
- find:
    path: .list-item
    do:
    - parse:
        # УКАЗЫВАЕМ ЧТО НАМ НУЖЕН АТРИБУТ `id`
        attr: id
        filter:
            # ЕСЛИ ПЕРВЫЙ ФИЛЬТР НАХОДИТ ЧТО ЛИБО, ТО ПРИМЕНЕНИЕ ФИЛЬТРОВ
            # ПРЕКРАЩАЕТСЯ И В РЕГИСТР ВОЗВРАЩАЕТСЯ НАЙДЕННОЕ ЗНАЧЕНИЕ
            # ОБРАТИТЕ ВНИМАНИЕ! НАЙДЕННЫЕ ГРУППЫ СОЕДИНЯЮТСЯ ВМЕСТЕ
            # ЕСЛИ БЫ У НАС В ПРИМЕРЕ БЫЛО:
            # <li class="list-item" id="item=2sub=3"><a href="http://somesite.com/">Link</a></li>
            # В РЕГИСТРЕ ОКАЗАЛОСЬ БЫ `23`
            - .+=(\d+)
            # ЕСЛИ ПЕРВЫЙ ФИЛЬТР НИЧЕГО НЕ НАШЕЛ ИСПОЛЬЗУЕТСЯ СЛЕДУЮЩИЙ ФИЛЬТР ИЗ НАБОРА И ТАК ДАЛЕЕ..
            - (.+)

# НАЙДЕМ `li` И ЗАПОЛНИМ РЕГИСТР БУКВАМИ ИЗ АТТРИБУТА `class`
- find:
    path: .list-item
    slice: 0
    do:
    - parse:
        # УКАЗЫВАЕМ ЧТО НАМ НУЖЕН АТРИБУТ `class`
        attr: class
        # ВЫБЕРЕМ ВСЕ БУКВЫ ИЗ АТТРИБУТА И ОБЪЕДИНИМ ИХ ИСПОЛЬЗУЯ ЗАПЯТУЮ
        filter: ([A-Za-z]{1})
        joinby: ','
    # В РЕГИСТРЕ У НАС БУДЕТ "l,i,s,t,i,t,e,m"
              

Далее мы рассмотрим еще одну команду, которой можно устанавливать значение регистра: register_set.