Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.08.2011, 16:59   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию DeleteLeft для строки....

Доброго времени суток!

Пишу парсер для сайта.

Собстенно там есть нейкий список элементов.
Выстраиваю его в строку...
элемент1<данные>|элемент2<данные>|э лемент3<данные>|элемент4

выгрубаю данные. И нужно убрать мусор после себя.
я удаляю то что обозначается началом элемент1 и ищу элемент2. Но чтобы продожить разбор, нужно удалить весь текст слева(мусор оставшийся от элемент1) от обозначения элемент2:
элемент2<данные>|элемент3<данные>|э лемент4

ухголова кругом уж не соображаю как это делать..
Человек_Борща вне форума Ответить с цитированием
Старый 26.08.2011, 17:03   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
i:=Pos('элемент2',s);
if i>0 then s:=Copy(s,i,Length(s)-i+1);
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 26.08.2011, 17:11   #3
fate
Форумчанин
 
Аватар для fate
 
Регистрация: 17.03.2009
Сообщений: 318
По умолчанию

что-то я не совсем понял задачу, тебе нужно удалить все кроме данных?
fate вне форума Ответить с цитированием
Старый 26.08.2011, 17:17   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

нет, смотрите:
Есть вот такие данные(часть из них):
Код:
{блок 1}
        <li class="prod_list_item">

                <a href="/catalog/3/29/id3719.html">
            <img class="product_list_pic" id="prodpic_3719" style="float:left;" alt="100020" src="../../../data/products/3/small/100020.jpg" />
        </a>
        <p>Артикул: 100020
                        
        </p>
        <p style="clear:both;">
                        Цена&nbsp;от 14.00 руб.
        </p>
        <div style="margin-top:-12px;">
            <input type="checkbox" class="product_list_checker " id="prodchecker_3719" value="3719"  />
                   <label for="prodchecker_3719">в корзину</label>
            <!--<a href="/catalog/3/29/id3719.html">подробно&nbsp;&rarr;</a>-->
        </div>
    </li>

{блок 2}
        <li class="prod_list_item">

                <a href="/catalog/3/29/id3719.html">
            <img class="product_list_pic" id="prodpic_3719" style="float:left;" alt="100020" src="../../../data/products/3/small/100020.jpg" />
        </a>
        <p>Артикул: 100020
                        
        </p>
        <p style="clear:both;">
                        Цена&nbsp;от 14.00 руб.
        </p>
        <div style="margin-top:-12px;">
            <input type="checkbox" class="product_list_checker " id="prodchecker_3719" value="3719"  />
                   <label for="prodchecker_3719">в корзину</label>
            <!--<a href="/catalog/3/29/id3719.html">подробно&nbsp;&rarr;</a>-->
        </div>
    </li>
алгоритм в цикле repeat until бегает по списку, пока не закончаться блоки данных. Блоком считается то, что находится после <li class="prod_list_item">

Ну так вот, алгоритм выгребает данные из "блок 1", и переходит к "блок 2", но т.к. идентификатора <li class="prod_list_item"> для "блок 1" больше нет(стираеся перед след. интерацией цикла), то остаётся мусор от "блок 1"...
по этому, нужно удалить все, что выше "блок 2" т.е. должно стать так:
Код:
{блок 2}
        <li class="prod_list_item">

                <a href="/catalog/3/29/id3719.html">
            <img class="product_list_pic" id="prodpic_3719" style="float:left;" alt="100020" src="../../../data/products/3/small/100020.jpg" />
        </a>
        <p>Артикул: 100020
                        
        </p>
        <p style="clear:both;">
                        Цена&nbsp;от 14.00 руб.
        </p>
        <div style="margin-top:-12px;">
            <input type="checkbox" class="product_list_checker " id="prodchecker_3719" value="3719"  />
                   <label for="prodchecker_3719">в корзину</label>
            <!--<a href="/catalog/3/29/id3719.html">подробно&nbsp;&rarr;</a>-->
        </div>
    </li>

Последний раз редактировалось Человек_Борща; 26.08.2011 в 17:21.
Человек_Борща вне форума Ответить с цитированием
Старый 26.08.2011, 17:22   #5
fate
Форумчанин
 
Аватар для fate
 
Регистрация: 17.03.2009
Сообщений: 318
По умолчанию

Цитата:
но т.к. идентивикатора <li class="prod_list_item"> для "блок 1" больше нет
а зачем ты удаляешь только <li class="prod_list_item"> ? вытащил нужные данные и удаляй сразу весь блок от <li class="prod_list_item"> до </li>
fate вне форума Ответить с цитированием
Старый 26.08.2011, 17:23   #6
fate
Форумчанин
 
Аватар для fate
 
Регистрация: 17.03.2009
Сообщений: 318
По умолчанию

а ты вытаскиваешь артикул и цену?
Могу набросать код с использованием регулярных выражений
fate вне форума Ответить с цитированием
Старый 26.08.2011, 17:26   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Если это сторока, чем не устраивает то, что выше предложено? Вместо 'элемент2' поставить '<li class="prod_list_item">'
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 26.08.2011, 17:35   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
i:=Pos('<li class="prod_list_item">',s);//порядок параметров уже не помню
while i>0 do
 begin
  //предположу что нужны артикул и цена
  i:=PosEx('<p>Артикул: ',s,i)+12;
  art:=Copy(s,i,PosEx(#13,s,i)-i));
  i:=PosEx('Цена&nbsp;от ',s,i)+13;
  price:=(s,i,PosEx(' руб',s,i)-i);
  i:=PosEx('<li class="prod_list_item">',s,i);
 end;
примерно так.

PS: залог хорошего парсера, не использовать Delete.(так как он снижает скорость+повышает расход памяти)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 26.08.2011, 17:41   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

fate, да имено эти данные. Спасибо, проблему решил удалением всего блокаа до </li>.

Пепел Феникса, благодарен за совет.

Всем ++
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Макрос для удаления строки julius Microsoft Office Excel 28 03.10.2014 00:19
Программа для анализа строки. Kulikcha Помощь студентам 2 23.06.2011 23:51
Форма для ввода строки Ksy JavaScript, Ajax 2 16.05.2011 10:01
Перебор для определения строки Maksval Microsoft Office Excel 8 24.12.2010 09:58
Память для динамической строки Tirendus Общие вопросы C/C++ 11 29.04.2010 15:40