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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.02.2011, 12:07   #1
savproga
 
Регистрация: 19.02.2011
Сообщений: 4
Радость Список URL всего сайта (Delphi)

Всем прием! =)
Ребят никак не получается рекурсия, чтобы получить все ссылки с сайта.

Надеюсь помочь кто сможет...
Изрыл все поисковики... Глухо
savproga вне форума Ответить с цитированием
Старый 19.02.2011, 15:40   #2
W0LF
Форумчанин
 
Аватар для W0LF
 
Регистрация: 28.03.2008
Сообщений: 940
По умолчанию

Как-то так:
Код:
var
  Source: string;
begin
  try
    Source := IdHTTP1.Get(Edit1.Text);
    ListBox1.Clear;
    while Pos('href="', Source) <> 0 do begin
      Delete(Source, 1, Pos('href="', Source) + Length('href="') - 1);
      ListBox1.Items.Add(Copy(Source, 1, Pos('"', Source) - 1));
      Application.ProcessMessages;
    end;
  except
    MessageDlg('Произошла ошибка!!!', mtError, [mbOK], 0);
  end;
end;
W0LF вне форума Ответить с цитированием
Старый 20.02.2011, 18:27   #3
kangreon
Форумчанин
 
Аватар для kangreon
 
Регистрация: 03.04.2009
Сообщений: 305
По умолчанию

Если еще актуально. Пару дней назад написал функцию для поиска ссылок. Она находит адреса следующего вида:

Код HTML:
<a href="http://site.ru/index.php">
<a href='http://site.ru/index.php'>
<a href=http://site.ru/index.php>
/index.php
./index.php
К двум последним добавляет домен. http://site.ru

Вот и сам код
PS PosR2L это первая попавшаяся в интернете функция для поиска вхождения символов в строку с конца.

В uses надо подключить StrUtils.
ParsURL(Исходный код страницы, Адрес страницы);
Код:
function PosR2L(const FindS, SrcS: string): Integer;
  function InvertS(const S: string): string;
  var
    i, Len: Integer;
  begin
    Len := Length(S);
    SetLength(Result, Len);
    for i := 1 to Len do
      Result[i] := S[Len - i + 1];
  end;
var
  ps: Integer;
begin
  ps := Pos(InvertS(FindS), InvertS(SrcS));
  if ps <> 0 then
    Result := Length(SrcS) - Length(FindS) - ps + 2
  else
    Result := 0;
end;

function ParsURL(Src: string; URLPage: string): string;
var
  i, y, r1, r2: integer;
  a, url: string;
  sl: TStringList;
  ur, dm: string;
begin
  sl := TStringList.Create;
  i := PosEx('/',URLPage,PosEx('://',URLPage)+3);
  dm := Copy(URLPage,1,i-1);
  i := 1;
  ur := Copy(URLPage,1,PosR2L('/',URLPage)-1);
  // Вытягиваем все <a ...>...</a>
  while PosEx('<a ',Src,i) <> 0 do
  begin
    i := PosEx('<a ',Src,i)+1;
    a := Copy(Src,i-1,PosEx('</a',Src,i)-i+5);
    y := PosEx('href',a);
    if y = 0 then
      Continue;

    y := y + 4;

    if a[y] <> '=' then
    begin
      y := PosEx('=',a,y);
      if y = 0 then
        Continue;
    end
    else
      Inc(y);
	  
    if a[y] = ' ' then
      inc(y);

    if a[y] = '"' then
    begin
      Inc(y);
      url := Copy(a,y,PosEx('"',a,y)-y);
    end
    else
    if a[y] = #39 then
    begin
      Inc(y);
      url := Copy(a,y,PosEx(#39,a,y)-y);
    end
    else
    begin
      r1 := PosEx(' ',a,y);
      r2 := PosEx('>',a,y);
      if (r1 > r2)or(r1 = 0) then
        url := Copy(a,y,r2-y)
      else
        url := Copy(a,y,r1-y);
    end;
    if url = '' then
      Continue;

    url := StringReplace(url,#13,'',[rfReplaceAll]);
    url := StringReplace(url,#10,'',[rfReplaceAll]);    

    if Copy(url,1,4) <> 'http' then
    if url[1] = '/' then
    begin
      url := dm + url;
    end
    else
    if (url[1] = '.') then
    begin
      if url[2] = '/' then
        url := ur + Copy(url,2,Length(url))
    end else
    begin
      url := ur + '/' + url;
    end;
    if url = '' then
      Continue;

    sl.Add(url);
  end;
  Result := sl.Text;
  sl.Free;
end;
Пример использования:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  s: string;
  http: TIdHTTP;
begin
  http := TIdHTTP.Create;
  s := http.Get('http://rutracker.org/forum/index.php');
  memo1.Text := ParsURL(s,http.URL.URI); // 
  http.Free;
end;
PPS. Может быть в Delphi есть стандартная функция поиска с конца строки?

Последний раз редактировалось kangreon; 20.02.2011 в 18:32.
kangreon вне форума Ответить с цитированием
Старый 21.02.2011, 09:33   #4
savproga
 
Регистрация: 19.02.2011
Сообщений: 4
По умолчанию

Функция поиска с конца строки: RightStr, с начала строки LeftStr.

ребят... вы все даете функции для поиска ссылок конкретно в 1 странице...
а мне нужна функция которая будет искать все страницы !САЙТА!. То есть если кто писал рекурсию на поиск файла в директории... тот меня поймет
savproga вне форума Ответить с цитированием
Старый 21.02.2011, 10:13   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ну а кто вам мешает сделать рекурсию?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.02.2011, 17:55   #6
savproga
 
Регистрация: 19.02.2011
Сообщений: 4
По умолчанию

Вот и проблема в том что никто не мешает, но она не получается...

Примеры есть у кого?
savproga вне форума Ответить с цитированием
Старый 21.02.2011, 18:23   #7
Д_М
Пользователь
 
Регистрация: 02.02.2011
Сообщений: 92
По умолчанию

Скачиваешь главную страницу, парсишь html, выделяешь ссылки, нормализуешь их,
оставляешь только те, которые ведут на тот же сайт.
Дальше рекурсией по полученному списку.

Сайт устроен не так, как директория - никто не обязан предоставлять список страниц, доступных по заданному пути.
Д_М вне форума Ответить с цитированием
Старый 21.02.2011, 18:29   #8
kangreon
Форумчанин
 
Аватар для kangreon
 
Регистрация: 03.04.2009
Сообщений: 305
По умолчанию

Создать 2 списка (TSTringList к примеру)
В первом будут все ссылки, во втором будут те, с которых уже загружены страницы.

а после в цикле загружаете по очереди ссылки на страницы (1) и сверяете с уже загруженными из списка 2. Если страница новая, загружаете ее, получаете все ссылки если ссылки уникальные (нету в 1 списке) и домен тот, который нужен - Добавляете в список 1. Примерно так.

Хотя можно и с 1 списком все сделать.
kangreon вне форума Ответить с цитированием
Старый 21.02.2011, 18:32   #9
Д_М
Пользователь
 
Регистрация: 02.02.2011
Сообщений: 92
По умолчанию

Цитата:
Хотя можно и с 1 списком все сделать.
Просто флажком помечать уже просмотренные страницы.
Д_М вне форума Ответить с цитированием
Старый 24.02.2011, 09:18   #10
savproga
 
Регистрация: 19.02.2011
Сообщений: 4
По умолчанию

может примеры рабочие у кого есть...
savproga вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Одноноправленный список В Delphi Spiriys Помощь студентам 0 06.06.2010 18:35
Delphi кольцевой список KingOfNothing Помощь студентам 3 27.09.2009 11:58
Вызов сайта из-под Delphi М@рф@ В@$ильн@ Помощь студентам 4 20.02.2009 15:41
Динамический список...на Delphi Olgasato Помощь студентам 6 11.12.2007 15:02