Парсинг текста определенной длины

Тема в разделе "Решение различных задач по парсингу", создана пользователем Serheo, 19 окт 2018.

  1. Serheo

    Serheo Well-Known Member Пользователи

    Регистрация:
    13 окт 2018
    Сообщения:
    251
    Город:
    Москва
    Есть вот такой исходный код:
    HTML:
    <div class="img"><img src="http://krasota.by/pic/dcontent/1383657650.120_5443.jpg" alt="" width="150" height="310" border="0"></div>
                <p><p align="center"><strong><em>Питание и укрепление волосяных луковиц<br />Активация роста<br />Восстановление структуры</em></strong></p>
    <p align="center"><strong><em></em></strong></p>
    <p align="justify">Мягкий шампунь-кондиционер «Крапива» обеспечивает сбалансированный уход за волосами и кожей головы. Крапива традиционно используется против выпадения волос и улучшения их роста. Целебный экстракт крапивы улучшает кровообращение кожи головы, питает и укрепляет волосяные луковицы. Витаминный комплекс дополняет оздоравливающее действие, восстанавливает структуру, сохраняет необходимую влагу. Ежедневное использование шампуня-кондиционера сделает Ваши волосы прочными и эластичными.</p>
    <p align="justify"><b>Применение</b>: небольшое количество шампуня нанести на влажные волосы, вспенить, тщательно промыть. Для усиления действия шампуня рекомендуется применять <strong><em>кондиционер-ополаскиватель «Крапива». </em></strong></p></p>
                <p><b>Содержит:</b><br />
                <ul>
    <li>экстракт крапивы</li>
    <li>витамин С</li>
    <li>пантенол </li></ul>
    <p><strong><em>номинальная<br />масса 500 г/g</em></strong></p>
            </div>
        </div>
        <div class="bottom"
    Надо спарсить только текст между тегами <p> </p>. Решил связкой :
    Код:
    <p {get}</p|<p {multiget}</p
    И вот теперь из полученного результата надо выбросить значения где текст между <p></p> длиннее 50 символов и сохранить все остальные. Т.е. "<p align="justify">Мягкий шампунь-кондиционер..." и "<p align="justify"><b>Применение" в результаты попасть не должно, а все остальное должно сохраниться. Как это сделать?
     
  2. inotoxic

    inotoxic Well-Known Member Пользователи

    Регистрация:
    13 сен 2015
    Сообщения:
    867
    Не первый раз встречаю такие темы на форуме.
    Это какая-то джедайская техника рерайта описаний к товарам ?

    Ссылки недоступны для гостей
     
  3. Serheo

    Serheo Well-Known Member Пользователи

    Регистрация:
    13 окт 2018
    Сообщения:
    251
    Город:
    Москва
    Это скорее джедайская техника публикации инфы на сайте доноре. Теги к которым можно гарантированно привязаться - это class="img" и class="bottom". Все остальное - сплошной рандом. Мне нужно выдернуть краткое описание. В данном случае подходят все относительно короткие вхождения между тегами <p></p>. Вот и ломаю голову как выбросить длинные. Ведь как-то же можно проанализировать выдачу оператора multiget?
     
  4. inotoxic

    inotoxic Well-Known Member Пользователи

    Регистрация:
    13 сен 2015
    Сообщения:
    867
    Ссылки недоступны для гостей
     
  5. Serheo

    Serheo Well-Known Member Пользователи

    Регистрация:
    13 окт 2018
    Сообщения:
    251
    Город:
    Москва
    Я это читал. Там обрезается текст просто от начала границы. А мне нужно сохранить все вхождения <p></p> внутри выделенного фрагмента короче 50 символов. Т.е. сохранить не все результаты работы оператора multiget, а только те, которые соответствуют данным требованиям.

    Макрос MINLENGTH:{strings} работает как надо, но только наоборот, благодаря оператору {strings}. То есть с помощью него можно отсеять маленькие вхождения и оставить большие.

    Почему у MAXLENGTH нет оператора {strings}??? Это как раз бы решило данную проблему.
     
    Последнее редактирование: 20 окт 2018
  6. Kreol

    Kreol Модератор Команда форума Модератор

    Регистрация:
    6 янв 2013
    Сообщения:
    2.666
    Берём границей общий текст
    В повторяющихся задаём обрабатывать ту границу и границы парсинга от <Р до </р>
    В повторяющихся вставляем макрос charcount в связке с if прописываем там условие, если > 50 то выводим иначе нет
    По-моему так
     
  7. Serheo

    Serheo Well-Known Member Пользователи

    Регистрация:
    13 окт 2018
    Сообщения:
    251
    Город:
    Москва
    Вот нутром понимаю, что сказали правильно, а математически выразить не могу. Могли бы Вы все это в проекте показать? Урл Ссылки недоступны для гостей . Кусок кода с границами в шапке. Границы <div class="img" и <div class="bottom" . Нужны все вхождения <p текст /p> где текст меньше 50 символов.
     
  8. Kreol

    Kreol Модератор Команда форума Модератор

    Регистрация:
    6 янв 2013
    Сообщения:
    2.666
    Разве что позже, пока не за компьютером
     
  9. Serheo

    Serheo Well-Known Member Пользователи

    Регистрация:
    13 окт 2018
    Сообщения:
    251
    Город:
    Москва
    Было бы классно. А то вчера весь мозг сломал как это сделать.
     
  10. Serheo

    Serheo Well-Known Member Пользователи

    Регистрация:
    13 окт 2018
    Сообщения:
    251
    Город:
    Москва
    Чот пока ждал разобрался сам. Инструкция.

    1. Создаем обычную границу парсинга в которой надо найти повторяющиеся границы и НЕ выводим ее в шаблон вывода (т.е. удаляем <CD_GRAN_1!>, если это 1-я граница).
    2. Создаем повторяющуюся границу. За границу берем повторяющиеся теги с текстом внутри, длину которого будем мерить.
    3. Открываем настройку повторяющихся границ. В ячейке справа "SOURCE" выставляем номер обычной границы из 1-го пункта этой инструкции. В левом окне под надписью "Повторяющиеся границы 1" вставляем:
    Код:
    [IF1][CHARCOUNT][VALUE][/CHARCOUNT]<230[THEN][VALUE][/IF1]
    Вместо 230 вставляем число символов размера текста между повторяющимися границами, которые надо вывести. Все, что длиннее выводится не будет.
    4. В шаблон вывода вставляем <CD_CYCLE_GRAN_1!> - куда будут выводится результаты, т.е. отобранный по длине текст.

    И вдогонку есть доработка идеи. Некоторые вхождения были нужной длины, но не подходили по содержанию. Все они содержали одинаковый заголовок. Поправил код для поиска текста нужной длины и отсева результатов, содержащих определенный текст.
    Код:
    [IF1][CHARCOUNT][VALUE][/CHARCOUNT]<230[THEN][STRINGSFILTER][DELETE][KEYS]Применение[/KEYS][VALUE][/STRINGSFILTER][/IF1]
    Теперь не будет выводиться текст длиннее 230 символов, а также текст содержащий слово "Применение" даже если он будет подходящей длины. Естественно длину и ключевое слово меняем на нужные.
     
    Последнее редактирование: 22 окт 2018
    kagorec нравится это.

Поделиться этой страницей