Методы для работы с регистром
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.