Парсер HTML контента + Совмещенные задания

22 ноября 2017, 14:22

Прежде всего стоит прочесть о настройке задания для RSS лент. Там основная суть работы компонента.

Совмещение заданий

С версии 1.2.0 компонент умеет совмещать задания. Например, вам нужно распарсить RSS ленту и каждую запись выпилить с сайта полностью. Для этого:

  1. Создаётся пара заданий (первое — RSS, второе — HTML),
  2. Настраивается,
  3. Запускается.

Ниже разберемся подробнее, как и что нужно делать для совмещения заданий.

Парсинг HTML контента

Так как в RSS ленте у нас, по-умолчанию, присутствует некий массив полей, которые можно распределить по полям MODX, то в HTML дела обстоят несколько сложнее: нам нужно самим создать эти поля, указав селектор до каждого из них. Давайте на примере MODX.pro рассмотрим, как это делается:

Добавление заданий

Покажу пример, в котором происходит запуск одного задания из другого. Для этого нам надо будет создать 2 задания:

Добавление primary задания

Primary заданием я называю список новостей, которые нам необходимо распарсить.

Жмём "Добавить HTML задание". На вкладке "Основное" заполняем примерно так:

Переключаемся на вкладку "Конфигурация", где указываем:

  • Селектор записи (пока только CSS-подобный синтаксис),
  • С какой по счёту записи стартовать,
  • Сколько записей парсить,
  • Шаблон для создаваемых ресурсов,
  • Контекст,
  • Родительский контейнер в пределах выбранного контекста,
  • Скачивать ли медиа-контент.

Жмём "Сохранить" - задание добавлено!

Добавление secondary задания

Secondary заданием я называю задание, с настройкой парсинга для полной статьи. Его мы будем указывать в качестве наследника для первого задания.

Жмём "Добавить HTML задание". На вкладке "Основное" заполняем примерно так:

Важно указать:
  • URL - ссылку на какую-нибудь статью с modx.pro (потребуется для настройки полей источника),
  • Поставить галочку Является подзадачей.

Переключаемся на вкладку "Конфигурация", где указываем:

  • Селектор записи = #content

Настройка источника

Так как задания у нас типа HTML, то придётся вручную создавать данные источника, которые будем парсить. Потребуется сделать это для обоих заданий.

Жмём на задании правой мышью => "Источник".

Настройка источника для primary задания

Здесь достаточно добавить всего 1 поле - ссылку на полную версию статьи. Однако, я предлагаю добавить ещё и поле content, в котором будет храниться вступительная часть статьи. В этом вступительном тексте также указывается основное изображение статьи, вот его то мы и будем выдирать с помощью регулярки. Происходить это будет на шаге Настройки полей primary задания.

Жмём "Добавить". Здесь у нас есть возможность указать CSS-подобный или XPath синтаксис. Для разных полей часто требуется и тот, и другой.

Внимание: XPath синтаксис имеет неприятный баг: не понимает названия тегов, поэтому приходится указывать тег, как *.

Заполняем примерно так:

Там же можно проверить, насколько корректно парсер получает указанные нами значения. Для этого требуется нажать на кнопку с глазом:

Настройка источника для secondary задания

Тут мы добавляем, также, 2 поля:

Pagetitle:
  • Синтаксис = CSS
  • Ключ = pagetitle
  • Селектор = h3.page-title
Content:
  • Синтаксис = CSS
  • Ключ = content
  • Селектор = .page-content

Настройка полей задания

По большому счёту тут всё очень похоже на настройку RSS задания, т.к. у нас уже есть данные из источника, которые можно просмотреть в виде распечатанного массива, кликнув по кнопке "Массив сырых значений".

Сейчас нам надо, опираясь на эти ключи и значения источника, правильно добавить поля для парсинга. Жмём на задании правой мышью => "Поля".

Описывать подробно возможности пакета на данном этапе не буду, кому интересно, может почитать это в описании настройки RSS заданий.

Настройка полей primary задания

Здесь тоже достаточно одного поля link, но мы добавим и поле с основным изображением поста. Выдернем это изображение из вступительной части статьи с помощью Fenom и регулярного выражения.

Жмём "Добавить".

Link:
  • Системное поле = пусто
  • Поле в источнике = link
  • Значение по-умолчанию = пусто
Introtext: (запишем сюда изображение)
  • Системное поле = resource | introtext
  • Поле в источнике = @INLINE {$content | preg_get : '!https?://.+\.(?:jpe?g|png|gif)!Ui'}
  • Значение по-умолчанию = пусто

Теперь, в таблице добавленных полей задания, у поля link, кликаем на звезду (поле должно стать оранжевым) и на соседнюю кнопку. Откроется окошко добавления связанного задания. Там есть сноска, продублирую:

1) Убедитесь, что выбранное поле действительно является ссылкой.

2) При парсинге эта ссылка будет передана в задание, которое вы выбрали ниже.

3) Из выбранного задания будут получены все поля для создания объекта.

4) Полученные поля перезапишут аналогичные поля из текущего задания.

В поле "Принимающее задание" выбираем наше secondary задание. Таким образом, primary задание передаст УРЛ из поля link в secondary задание.

Жмём "Сохранить".

Поле link в таблице подсветится синим цветом:

Настройка полей secondary задания

Тут добавляем 3 поля:

Pagetitle:
  • Системное поле = resource | pagetitle
  • Поле в источнике = @INLINE {$pagetitle | preg_replace : '! \<sup class.*!ui'}
  • Значение по-умолчанию = пусто
Content:
  • Системное поле = resource | content
  • Поле в источнике = content
  • Значение по-умолчанию = пусто
Published:
  • Системное поле = resource | published
  • Поле в источнике = пусто
  • Значение по-умолчанию = 1

Сохраняем!


Предыдущий документ
Парсер RSS лент
Следующий документ
Скрипт запуска заданий из Cron