Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Парсинг сылок


Автор: za12 8.10.2007, 09:58
Всем привет.. народ подскажите как правильно определить какая ссылка на странице принадлежит сайту, т.е его внутренняя ссылка, а какие ссылки внешними, в вобщем проблема такая, как прописать условие, чтобы ссылки вида href="/"или href="/текст/" определялись как внутренние.


для парсинга ссылок использую такой код 

Код

i:=0;
k:=0;
while True do begin
      idxPos:=PosEx('<a ', text, idxPos);
      if idxPos=0 then Break;
      Inc(idxPos, 2);
      idxPos:=PosEx('href', text, idxPos);
      if idxPos<=0 then Continue;
      Inc(idxPos, 4);
      link:=Copy(text, idxPos, PosEx('>', text, idxPos)-idxPos);
       
      links:=Pos('blabla.ru', link);
      if links>0 then
      begin
      i:=i+1;
      Memo4.Lines.Add(inttostr(i)+'-'+link+'Внутряк');
      end else
      begin
      k:=k+1;
      Memo4.Lines.Add(inttostr(k)+'-'+link+'ВНЕШНЯЯ');
      end;




Автор: Alix 8.10.2007, 10:28
Ненавижу использовать для таких целей такой код. Я бы воспользовался регулярными выражениями. 

Автор: ishimcity 8.10.2007, 10:54
есть хорошие програмы для парсинга

Paessler Site Inspector
Paessler URL Recorder

Автор: za12 8.10.2007, 11:15
Цитата(Alix @  8.10.2007,  10:28 Найти цитируемый пост)
Ненавижу использовать для таких целей такой код. Я бы воспользовался регулярными выражениями. 


а есть пример с использованием регулярных выражений??



Цитата(ishimcity @  8.10.2007,  10:54 Найти цитируемый пост)
есть хорошие программы для парсинга

Paessler Site Inspector
Paessler URL Recorder 


знаю что есть.. нужна своя.

Автор: Alix 8.10.2007, 11:17
Кидаем memo1 с исходным текстом страницы, memo2 и button.
Код
uses
  RegExpr; // берем с http://www.regexpstudio.com/

procedure TForm1.Button1Click(Sender: TObject);
var
  regexp : TRegExpr;

begin
  memo2.Clear;

  regexp := TRegExpr.Create;
  regexp.Expression := '(?i)<\s*a[^>]*?href\s*=\s*(["''])([^\1]*?)\1[^>]*>';
  regexp.Compile;
  regexp.InputString := memo1.Lines.Text;

  if not regexp.Exec then
    exit;

  repeat
    memo2.Lines.Add(regexp.Match[2]);
  until not regexp.ExecNext;

  regexp.Free;
end;

Никаких try..except/finally не использовал (на exit без Free тоже не обращаем внимания) т.к. это лишь пример. В цикле я получаю текст атрибута href (regexp.Match[2]), что с ним делать - решай сам smile
Если надо, прокомментирую выражение.

Модераторы!, имхо, это вопрос не для раздела сети...

Автор: za12 8.10.2007, 11:35
Цитата(Alix @  8.10.2007,  11:17 Найти цитируемый пост)
Кидаем memo1 с исходным текстом страницы, memo2 и button.
Выделить всёкод Pascal/Delphi

uses
  RegExpr; // берем с http://www.regexpstudio.com/
procedure TForm1.Button1Click(Sender: TObject);
var
  regexp : TRegExpr;
begin
  memo2.Clear;
  regexp := TRegExpr.Create;
  regexp.Expression := '(?i)<\s*a[^>]*?href\s*=\s*(["''])([^\1]*?)\1[^>]*>';
  regexp.Compile;
  regexp.InputString := memo1.Lines.Text;
  if not regexp.Exec then
    exit;
  repeat
    memo2.Lines.Add(regexp.Match[2]);
  until not regexp.ExecNext;
  regexp.Free;
end;

Никаких try..except/finally не использовал (на exit без Free тоже не обращаем внимания) т.к. это лишь пример. В цикле я получаю текст атрибута href (regexp.Match[2]), что с ним делать - решай сам smile
Если надо, прокомментирую выражение.

Модераторы!, имхо, это вопрос не для раздела сети...


спасибо... 

Автор: za12 8.10.2007, 12:10
Народ чет не врубаюсь, а где там компонент валяется. чет ссылки не вижу.?

Автор: Alix 8.10.2007, 12:44
докатились...
http://www.regexpstudio.com/Downloads/regexpr_RU.rar

Автор: XerSon 29.3.2008, 11:29
Всем привет! У меня возникли некие сомненья, по поводу исп в Регулярных выражениях (RegExpr) - такого вида синтаксиса: 

Легенда: Есть рег выражение типа Строка:блаблабла
Реализация: Как сие найти во входных данных и вывести, отделив Строка: и оставив блаблабла

??? 

Автор: aktuba 29.3.2008, 12:21
По двоеточию.

Автор: XerSon 29.3.2008, 13:46
Цитата(aktuba @ 29.3.2008,  12:21)
По двоеточию.

По двоеточию не льзя! Только в том варианте что я описал!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)