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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.01.2015, 22:31   #1
Максим_maks
Пользователь
 
Регистрация: 18.01.2015
Сообщений: 51
По умолчанию Парсер HTML кода

Всем привет. Я здесь новенький. Помогите достать ссылки из компонента MEMO, ссылки вида:

<HTML><BODY><a href="http://habrahabr.ru/post/242485/">http://habrahabr.ru/post/242485/</a><br><a href="http://habrahabr.ru/post/242485/">http://habrahabr.ru/post/242485/</a><br><a href="http://habrahabr.ru/post/242477/">http://habrahabr.ru/post/242477/</a><br><a href="http://habrahabr.ru/post/242487/">http://habrahabr.ru/post/242487/</a><br>http://habrahabr.ru/post/242481/<br><br><br></BODY></HTML>


Нужно достать текст от " до ". Спасибо
Максим_maks вне форума Ответить с цитированием
Старый 18.01.2015, 22:33   #2
WinCoder
Заблокирован
 
Регистрация: 24.11.2014
Сообщений: 721
По умолчанию

Погугли регулярные выражения, RegExp.
WinCoder вне форума Ответить с цитированием
Старый 18.01.2015, 22:41   #3
Максим_maks
Пользователь
 
Регистрация: 18.01.2015
Сообщений: 51
По умолчанию

Вот нашел код, но как его правильно пользовать пока не дохожу (((
Код:
function PervertedMemoSearching(const TextToFind : String;
                               const MemoSrc, MemoDst : TMemo;
                               const ClearDest : boolean = true) : boolean;
const
MoveBy_value = 3;
var
p : Integer;
MemoText : String;
begin
Result := false;
if ClearDest then MemoDst.Clear;

MemoText := MemoSrc.Text;

p := Pos(TextToFind, MemoText);
while (p > 0) do begin
 MemoSrc.SelStart := p + MoveBy_value + length(TextToFind);
 MemoSrc.SelLength := 0;

 MemoText := Copy(MemoText, MemoSrc.SelStart, length(MemoSrc.Text));
 MemoDst.Text := MemoDst.Text + MemoText;

 p := Pos(TextToFind, MemoText);
end;
end;

Последний раз редактировалось Stilet; 19.01.2015 в 08:01.
Максим_maks вне форума Ответить с цитированием
Старый 18.01.2015, 22:54   #4
lomastr_
Форумчанин
 
Регистрация: 16.01.2015
Сообщений: 672
По умолчанию

Этот код никакие ссылки не достает.
Он не из этой оперы.
lomastr_ вне форума Ответить с цитированием
Старый 18.01.2015, 23:52   #5
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Берём строку и находим все href=. Всё, что за ним, будет ссылкой.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 19.01.2015, 00:39   #6
Максим_maks
Пользователь
 
Регистрация: 18.01.2015
Сообщений: 51
По умолчанию

Данный код работает
Код:
procedure TForm1.FormCreate(Sender: TObject);
var
RegExp: TRegExpr;
begin
 RegExp := TRegExpr.Create;
 RegExp.InputString :='<HTML><BODY><a href="http://habrahabr.ru/post/242485/">http://habrahabr.ru/post/242485/</a><br>';
 RegExp.Expression := 'href="(.*?)">(.*?)<';
 if RegExp.Exec(RegExp.InputString) then
 begin
  ShowMessage(RegExp.Match[1]);
 // ShowMessage(RegExp.Match[2]); 
 end;
 RegExp.Free;

end;
Но вот как теперь достать все ссылки - надо курить )

Последний раз редактировалось Stilet; 19.01.2015 в 08:02.
Максим_maks вне форума Ответить с цитированием
Старый 19.01.2015, 01:19   #7
Максим_maks
Пользователь
 
Регистрация: 18.01.2015
Сообщений: 51
По умолчанию

Готовый код
Код:
procedure TForm1.FormCreate(Sender: TObject);
var
RegExp: TRegExpr;
i:integer;
list:TStringList;
begin
 list:=TStringList.Create;
 RegExp := TRegExpr.Create;
 List.Text:=Memo1.Text;
 RegExp.Expression := 'href="(.*?)">(.*?)<';
 if RegExp.Exec(List.Text) then
 repeat
 Memo2.Lines.Add(RegExp.Match[1]);
 until not RegExp.ExecNext;
  FreeAndNil(list);
FreeAndNil(RegExp);
 end;

Последний раз редактировалось Stilet; 19.01.2015 в 08:02.
Максим_maks вне форума Ответить с цитированием
Старый 19.01.2015, 20:11   #8
NIKOLAYY2
Форумчанин
 
Регистрация: 23.12.2014
Сообщений: 220
По умолчанию

Цитата:
Максим_maks Готовый код
А зачем ты пишеш выражение 'href="(.*?)">(.*?)<';
Если используеш только Match[1] ?

Последний раз редактировалось NIKOLAYY2; 19.01.2015 в 20:15.
NIKOLAYY2 вне форума Ответить с цитированием
Старый 19.01.2015, 21:33   #9
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

Код:
str:=Memo1.Lines[1];
str:=Copy(str,Pos('"',str),Length(str)-Pos('"',str));//копируем весь текст от первых кавычек до конца
str:=Copy(str,1,Pos('"',str));//копируем с первого символа до следующих кавычек.
ну, или если в окне Memo код будет переноситься, то есть возможен разрыв ссылок, то сначала придётся все строки Memo1.Lines[i] собрать в одну строку и уж потом выуживать информацию
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Старый 20.01.2015, 00:06   #10
Максим_maks
Пользователь
 
Регистрация: 18.01.2015
Сообщений: 51
По умолчанию

Спасибо за исправления, учту
Максим_maks вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Парсер ссылок HTML Lazio C# (си шарп) 4 14.09.2015 21:15
Парсер HTML страницы kardinal94 Работа с сетью в Delphi 1 21.08.2010 13:06
Парсер, выполнение кода. zumm Общие вопросы Delphi 27 30.06.2010 13:29
Парсер из HTML в CSV. OJI HTML и CSS 5 09.09.2009 19:59
обновление в блоге - Быстрый парсер html кода на Delphi Pblog Обсуждение статей 0 09.08.2008 22:10