Wyciąganie adresu url z wyników google

0

Witam

Piszę program w którym potrzebuję wyciągnąć adres pierwszej pozycji, która wyświetli się w wyszukiwaniu w google.

Przykładowo//www.google.pl/search?client=firefox-a&rls=org.mozilla%3Apl%3Aofficial&channel=s&hl=pl&source=hp&q=programowanie&lr=&btnG=Szukaj+w+Google gdy wczytam w programie ten adres jak wyciągnąć potem url pierwszej wyszukanej pozycji czyli tutaj akurat http://pl.wikipedia.org/wiki/Programowanie ?

Szukam stosunkowo jakiegoś prostego rozwiązania i będę wdzięczny za wszelką pomoc. [soczek]

0

Jeżeli rozwiązanie ma być proste to można użyć Indy (dlatego, że to standardowy komponent) nie proponuję też wyrażeń regularnych bo wymagało by to użycia dodatkowego modułu RegExpr.

const
  START_TAG = '<cite>';
  END_TAG = '</cite>';
  DELETE_TAGS : array [0..1] of string = ('<b>', '</b>');
var
  html, url: string;
  p1, p2, i: Integer;
begin
  //do uses StrUtils (ze względu na uzycie PosEx)
  //gdy pozwolimy na ciacha gdyby funkcję wykonamy kilka razy
  //czasami otrzymamy różne wyniki (tak działa google)
  IdHttp1.AllowCookies:= False;
  html:= IdHttp1.Get(Edit1.Text); //w edit jest adres wyszukiwania
  p1:= Pos(START_TAG, html);
  p2:= PosEx(END_TAG, html, p1);
  if ((p1 > 0) and (p2 > 0)) then
  begin
    url:= Copy(html, p1 + Length(START_TAG), p2 - p1 - Length(START_TAG));
    for i:=0 to High(DELETE_TAGS) do
      url:= StringReplace(url, DELETE_TAGS[i], '', [rfReplaceAll, rfIgnoreCase]);
    ShowMessage(url);
  end;
end;
0

Ja bym jednak polecil Synapse, bo jak ktoś korzysta z Delphi 7 Personal to niekoniecznie ma zainstalowane Indy.
A do wyodrębnien ia znaków z pomiędzy dwoch znaczników polecam taki kod jak poniżej autorstwa Misiekd, bo
kAzek skoro przejmujemy się koniecznością użycia dodatkowych modułów to PosEx także wymusza ów użycie.

function SimpleParse(StrBegin, StrEnd, Str : string) : string;
var
  B, E : integer;
begin
  Result := '';
  if StrBegin = '' then
  begin
    B := 1;
  end
  else
  begin
    B := Pos(StrBegin, Str);
  end;
  if B > 0 then
  begin
    Str := Copy(Str, B + Length(StrBegin), MaxInt);
    if StrEnd = '' then
    begin
      E := Length(Str) + 1;
    end
    else
    begin
      E := Pos(StrEnd, Str);
    end;
    if E > 0 then
    begin
      Result := Copy(Str, 1, E - 1);
    end;
  end;
end;

Przykład użycia:

  SimpleParste('<cos>', '</cos>', TekstStrony);

A później ewentualne niepotrzebne znaki w wyciągniętym tekstcie zamienić na '' przez funckję StringReplace, która
od wersji bodajże siódemej Delphi, jest dostępna w standardowo dołączonym modeul SysUtils. Nie wiem jak PosEx.

0

PosEx jest w StrUtils

0

Tak ktosik, wiem(y). Jednak to już dodatkowy moduł. Jakby co to funkcja ta wygląda tak jak poniżej.
A przynajmniej taką ktoś kiedyś podawał chyba tutaj na forum jeszcze dla posiadaczy starych Delphi.

function PosEx(const SubStr, S : string; Offset : integer) : integer;
var
  I, X : Integer;
  Len, LenSubStr : Integer;
begin
  if Offset = 1 then
    Result := Pos(SubStr, S)
  else
  begin
    if Offset < 0 then
    begin
      Result := 0;
      Exit;
    end;
    I := Offset;
    LenSubStr := Length(SubStr);
    Len := Length(S) - LenSubStr + 1;
    while I <= Len do
    begin
      if S[I] = SubStr[1] then
      begin
        X := 1;
        while (X < LenSubStr) and (S[I + X] = SubStr[X + 1]) do
          Inc(X);
        if (X = LenSubStr) then
        begin
          Result := I;
          Exit;
        end;
      end;
      Inc(I);
    end;
    Result := 0;
  end;
end;
0

olesio nie chodziło mi o optymalizację pod względem wielkości tylko czasu i łatwości zrobienia (instalacja pobieranie modułów/komponentów) ale masz rację nie pomyślałem, że Indy nie ma domyślnie w wersjach Personal więc faktycznie jak już instalować to lżejsze Synapse.
Co do do PosEx skoro już o tym mowa to myślę że na te potrzeby można by trochę skrócić tą oryginalną funkcję o sprawdzanie kilku warunków.

1 użytkowników online, w tym zalogowanych: 0, gości: 1