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

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

Форум программистов (https://programmersforum.ru/index.php)
-   Общие вопросы Delphi (https://programmersforum.ru/forumdisplay.php?f=2)
-   -   парс страницы (https://programmersforum.ru/showthread.php?t=206820)

Skalp 04.07.2012 17:18

парс страницы
 
В общем, начал я парсить html страницу, все прошло нормально, нашел все, что хотел. Результат я записал в мемо. Помимо нужной мне информации в мемо еще куча пустых строк, в которых только символы в роде таких: #$A и #$D.
Помогите пожалуйста от них избавиться.

eoln 04.07.2012 17:42

#$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)


Skalp 04.07.2012 18:04

Вложений: 2
Что делать, если такие символы присутствуют в строчке с нужной мне информацией, не удалять же всю строчку? Взять ее отдельно в цикл, где будут удаляться только эти символы?
И еще, в строчках присутствуют и перевод и возврат каретки, и пробелы тоже, количество пробелов неизвестно. Что делать в таком случае?
------
Код:

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 на всякий случай.

eoln 04.07.2012 18:27

Цитата:

Сообщение от Skalp (Сообщение 1070844)
Что делать в таком случае?

Гуглить на предмет функций для работы со строками. Для данной задачи достаточно нескольких простейших (pos, copy, del).
Если есть желание, то можно углубиться в StrUtils

Skalp 04.07.2012 18:34

Цитата:

Сообщение от eoln (Сообщение 1070855)
Гуглить на предмет функций для работы со строками. Для данной задачи достаточно нескольких простейших (pos, copy, del).
Если есть желание, то можно углубиться в StrUtils

Вот этих "простейших" как раз и не хватило)
Хотя, сейчас попробую еще кое-что сделать.

s-andriano 04.07.2012 19:25

А зачем их вообще удалять? Их нужно просто игнорировать.
При парсинге следует использовать такое понятие как "разделитель". Символы конца строки и возврата каретки являются такими же разделителями, как и пробел. И обрабатывать все эти символы нужно единообразно.
Можно, конечно, пользоваться pos, copy и del, но это очень нерационально с точки зрения скорости обработки.

Skalp 05.07.2012 11:56

Тогда скажите, какие из этих символов возврат и перевод каретки (#$A #$D), и как понимать их комбинации типа #$A#$D#$A. И я не пойму, как их игнорировать, если я выполняю парс страницы с помощью регулярных выражений?

s-andriano 05.07.2012 19:37

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


01:59.