В Parser-е появилась возможность парсить контент не имеющего своих отдельных страниц и выводящийся в виде списков. Например это могут быть комментарии, позиции прайса, фотографии в галерее и т.п.
Для парсинга списков нужно в разделе Дополнительные настройки включить Режим списка и в поле Элементы списка написать код, который вернёт массив с элементами списка:
После этого при наполнении полей станут доступны две новых переменных — $doc_element
и $element_html
.
Пример парсинга комментариев со страницы http://php.net/manual/ru/function.strpos.php:
Элементы списка:
$elements = array();
foreach ($doc->find('#allnotes .note') as $element) {
$elements[] = pq($element)->htmlOuter();
}
return $elements;
Содержимое:
return array(
'value' => $doc_element->find('.html')->html(),
'format' => 'filtered_html',
);
Имя:
return $doc_element->find('.user')->text();
Написанное актуально для
Parser 2
Комментарии
круто! а page_key для них поддерживается? (в качестве ключей массива, напримэр?)
пока нет, в планах
да
page_key - что это и как использовать?
у меня получается список по 20 комментов на странице.
С одной страницы на одну прекрасно вставляется. а вот ещё 20 с другого урла в туже ноду(nid) - нет.
Сейчас понял и ошибка на это показывает что $element_html = $elements[$context['sandbox']['element']];
$context['sandbox']['element'] - продолжает счетчик 20...
а на новой странице он же опять идет от 0 до 19
Подскажите как это подправить?
page_key это старое название remote_id
попробуйте после
$context['sandbox']['progress']++;
вставить:Спасибо. Работает!
Отработало 3 минуты - Создано сущностей: 1096
потом вдруг бах - Notice: Undefined variable: doc_element в функции eval() (строка 1 в файле /sites/all/modules/parser/parser.module(618) : eval()'d code).
Понимаю что в - "Код проверки для дальнейшего парсинга страницы" не появилась переменная $doc_element - то есть там лучше пользоваться $doc? сделал так:
если нет элементов для парсинга, то код проверки должен возвращать false
Пытаюсь понять понять как работает парсинг списков.
Внимательно ознакомилась со всеми комментариями из темы http://xandeadx.ru/blog/drupal/399#comment-9844 - не помогает. Мое предположение о том, что возвращаемый в поле "Элементы списка" массив обходится, и на каждый элемент создается сущность, не подтверждается.
Пытаюсь парсить список в field collection, т.е. по моим представлениям на каждый элемент списка должен создаваться field collection item. Элемент коллекции создается и привязывается к родительской сущности (созданной в другом задании) корректно, но только один - первый из массива, остальные элементы массива игнорируются.
Ваш комментарий из вышеуказанной темы: "в одном задании создавайте сущность field collection, в другом связывайте её с нодой" наталкивает меня на мысль о том, что я не совсем верно понимаю механизм работы модуля. Поясните, пожалуйста, как можно field collection создать в одном задании, а связать с нодой в другом, если поле Host entity является обязательным для заполнения в задании, в котором создается элемент коллекции. И как корректно спарсить контент, расположенный на одной странице в field collection?
именно так и работает
xandeadx, не подскажешь по phpQuery?
Есть код:
Если я делаю так:
То получаю:
Т.е.
html()
выдирает только код, располагающийся внутри.comment
, а мне нужно, чтобы получилось так:->htmlOuter()
Спасибо!
Подскажите как парсить комментарии. Спарсил материалы, создал задание для парсинга комментариев к этим материалам, в поле "Элементы списка" получаю массив комментариев с исходной страницы, в поле "Remote id" указываю id материала на исходном сайте. В поле "Тема" указываю элемент списка:
Комментарий добавляется, но только первый. Подскажите как парсить чтобы добавлялись все комментарии из массива в поле "Элементы списка"?
видимо в элементах списка возвращаете только один комментарий
Проблема в поле "Remote id", для комментариев туда подставляется id материала и если в поле парсинга указать именно id материала, то парсится только первый комментарий, а остальные игнорируются. Если же при парсинге комментариев в "Remote id" писать id комментария, то парсятся все комментарии, но при повторном запуске все комментарии добавляются вновь (дублируются). Что нужно писать в "Remote id" для корректной работы?
id комментария
Тогда при повторном запуске парсера комментарии дублиются, в результатах работы парсера в поле "Remote id" для записей стоит id материала (видимо парсер сам его проставляет), но соответствие id комментария почему-то не проверяется и создаётся новый комментарий с тем же содержимым.
Если в поле "Remote id" вставить
return 123;
, то парсятся все элементы массива "Элементы списка" (в моём случае комментарии), но при повторном запуске они вновь добавляются как новые комментарии.что-то не так делаете
При парсенге списков в материалы всё работает нормально, поле "Remote id" записывается корректно. Но при создании комментариев к материалу из списка парсер всем создаваемым комментариям прописывает "Remote id" в виде id родительской статьи. Поэтому комментарии дублируются при повторном запуске парсера. Скрин результатов работы http://joxi.ru/J2b9v70cyqlZm6. Думаю ошибка в алгоритме создания комментариев из списка.
модуль самостоятельно remote id не прописывает, про "родительские статьи" он ничего не знает
Мой косяк: в при расчете одного из полей назвал переменную
$remote_id
- она затирала значение, вычисленное в поле выше.Как получить доступ к порядковому номеру элемента списка при парсинге?
$context['sandbox']['element']
Спасибо! То что надо!
Здравствуйте!
Пробую парсинг комментариев. Возникла проблема с получением данных для title или другого кастомного поля (CCK). Когда использую конструкцию: $doc->find('***')->text(), то получаю абсолютно все найденные данные на странице.
При использовании $doc_element - данные не получаю.
Прикрепляю экспортированный parser_job (сюда не получается добавить из-за ограничения поля): pastecode.io/s/7mrj1xvx
Заранее благодарю!
Добавить комментарий