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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.07.2012, 17:18   #1
Skalp
Пользователь
 
Регистрация: 01.12.2011
Сообщений: 52
По умолчанию парс страницы

В общем, начал я парсить html страницу, все прошло нормально, нашел все, что хотел. Результат я записал в мемо. Помимо нужной мне информации в мемо еще куча пустых строк, в которых только символы в роде таких: #$A и #$D.
Помогите пожалуйста от них избавиться.
Skalp вне форума Ответить с цитированием
Старый 04.07.2012, 17:42   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

#$A и #$D это возврат и перевод каретки. В цикле проверять и ненужное выкидывать
Код:
for i := memo1.lines.count-1 downto 0 do
  if (memo1.lines[i]=#10) or (memo1.lines[i]='') then
    memo1.lines.delete(i)
eoln вне форума Ответить с цитированием
Старый 04.07.2012, 18:04   #3
Skalp
Пользователь
 
Регистрация: 01.12.2011
Сообщений: 52
По умолчанию

Что делать, если такие символы присутствуют в строчке с нужной мне информацией, не удалять же всю строчку? Взять ее отдельно в цикл, где будут удаляться только эти символы?
И еще, в строчках присутствуют и перевод и возврат каретки, и пробелы тоже, количество пробелов неизвестно. Что делать в таком случае?
------
Код:
procedure TForm1.Button1Click(Sender: TObject);
var s1,s2,s3: string;
    RegExp: TRegExpr;
begin
  s1:=memo1.Text;
  RegExp:=TRegExpr.Create;
  try
    RegExp.Expression:='<.*?>';
    if RegExp.Exec(s1) then
      repeat
        s2:=regexp.Match[0];
        s3:=copy(s1,1,pos(s2,s1)-1);
        Listbox1.items.Add(s3);
        delete(s1,1,pos(s2,s1)+length(s2)-1);
      until not RegExp.ExecNext;
    finally RegExp.Free;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
memo1.Lines.LoadFromFile('1.txt');
end;
Я загрузил текстовый файл, который мы парсим и модуль RegExpr на всякий случай.
Вложения
Тип файла: txt 1.txt (26.2 Кб, 125 просмотров)
Тип файла: zip RegExpr.zip (34.0 Кб, 6 просмотров)

Последний раз редактировалось Skalp; 04.07.2012 в 18:33.
Skalp вне форума Ответить с цитированием
Старый 04.07.2012, 18:27   #4
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Цитата:
Сообщение от Skalp Посмотреть сообщение
Что делать в таком случае?
Гуглить на предмет функций для работы со строками. Для данной задачи достаточно нескольких простейших (pos, copy, del).
Если есть желание, то можно углубиться в StrUtils
eoln вне форума Ответить с цитированием
Старый 04.07.2012, 18:34   #5
Skalp
Пользователь
 
Регистрация: 01.12.2011
Сообщений: 52
По умолчанию

Цитата:
Сообщение от eoln Посмотреть сообщение
Гуглить на предмет функций для работы со строками. Для данной задачи достаточно нескольких простейших (pos, copy, del).
Если есть желание, то можно углубиться в StrUtils
Вот этих "простейших" как раз и не хватило)
Хотя, сейчас попробую еще кое-что сделать.
Skalp вне форума Ответить с цитированием
Старый 04.07.2012, 19:25   #6
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

А зачем их вообще удалять? Их нужно просто игнорировать.
При парсинге следует использовать такое понятие как "разделитель". Символы конца строки и возврата каретки являются такими же разделителями, как и пробел. И обрабатывать все эти символы нужно единообразно.
Можно, конечно, пользоваться pos, copy и del, но это очень нерационально с точки зрения скорости обработки.
s-andriano вне форума Ответить с цитированием
Старый 05.07.2012, 11:56   #7
Skalp
Пользователь
 
Регистрация: 01.12.2011
Сообщений: 52
По умолчанию

Тогда скажите, какие из этих символов возврат и перевод каретки (#$A #$D), и как понимать их комбинации типа #$A#$D#$A. И я не пойму, как их игнорировать, если я выполняю парс страницы с помощью регулярных выражений?
Skalp вне форума Ответить с цитированием
Старый 05.07.2012, 19:37   #8
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Символ, имеющий десятичный номер 10 или 16-чный $A, называется символом конца строки (LF), а 13 и $D соответственно - символом возврата каретки (CR).
Комбинация #$A#$D#$A в нормальном случае может встретиться только в виде #$D#$A#$D#$A, где она обозначает пустую строку.
В DOS и Windows принято конец строки обозначать парой символов #$D#$A, в Unix для этих же целей принято использовать единственный символ #$A.
s-andriano вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
парс для сайта Jadson Работа с сетью в Delphi 2 24.04.2012 17:16
Парс ссылки cargo29 Общие вопросы Delphi 3 07.07.2011 18:32
Вставка особой нумерации на нечетные страницы с разрывом страницы akokin Microsoft Office Word 13 20.10.2009 15:23
Динамическое изменение URL страницы в JavaScript без перезагрузки страницы ilusha JavaScript, Ajax 7 25.02.2009 09:59
Как сделать разрыв страницы печати по условию и узнать номер страницы Leanna Microsoft Office Excel 2 21.01.2008 06:59