Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
İç içe döngüde başa dönme
#1
Merhaba,

Web sitesinden 3 adet iç, içe döngü ile ilk sayfadan verileri alıyorum.
Bir sonraki sayfaya geçildiğinde veriler alabilmek için tekrar döngüleri yeniden nasıl başlata bilirim?

 aSPANtag := Doc.All.Tags('span');
    for iSpan := 0 to aSPANtag.Length - 1 do // Kaç sayfa var
    begin
      if SameText(aSPANtag.Item(iSpan).className, 's-pagination-item s-pagination-disabled') then
      begin
        PageNumber := aSPANtag.Item(iSpan).InnerText; //Toplam sayfa adet
        NextPage := aSPANtag.Item(iSpan).InnerText;// Sonraki sayfa
        aDIVtags := Doc.All.Tags('div');
        for iDiv := 0 to aDIVtags.Length - 1 do // Listelenenler
        begin
          if Pos('ol-4-of-pacing-small', aDIVtags.Item(iDiv).className) > 0 then
          begin
            aHREFtag := aDIVtags.Item(iDiv).All.Tags['a'];
            for iHref := 0 to aHREFtag.Length - 1 do // Linkler
            begin
              if SameText(aHREFtag.Item(iHref).className, 'a-linkoutline') then
              begin
             Memo1.Lines.Add(aHREFtag.item(iHref).href);
              end
              else
              begin
                if PageNumber <= NextPage then

                  // SAYFA BİTMEMİŞSE Döngü başa dönecek

              end;
            end;
          end;
        end;
Cevapla
#2
En içteki döngüden çıkmak için break; ifadesini kullanabilirsiniz. Böylece En üst ve bir altındaki döngü kaldığı indeksten devam edecek, en içteki döngü de en baştan başlayacaktır.
Begin : = end / 2;
Cevapla
#3
Bir function ile sayfa parse işlemini yaparsınız,
function result olarak sonraki sayfa varsa linkini, eğer yoksa da boş döndürürsünüz.

Basit bir while ile RESULT dolu ise aynı function'u döben link ile çağırırsınız.

Dönüş bir link de olabilir yeniden parse edilecek html içerik de.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#4
@mrmarman @RAD Coder Kod üzerinden örnek verebilir misiniz? size zahmet
Cevapla
#5
Elimize yapışmaz  Smile

uses MSHTML;

function ParsePage( aWB:TWebBrowser; aList: TStrings; var aActivePageNum: Integer ): String;
var
  LTagList      : OleVariant;
  iPath         : Integer;
begin
  Result  := '';
  // #01 Şimdiki sayfa No okuyalım...
    LTagList   := aWB.OleObject.Document.all.tags('span');
  for iPath := 0 to LTagList.length - 1 do
    if Pos( 'pagination_current', LTagList.item(iPath).className ) > 0
      then aActivePageNum := StrToInt(LTagList.item(iPath).InnerHtml);

  // #02 NextPage var mı diye bakalım...
  LTagList   := aWB.OleObject.Document.all.tags('a');
  for iPath := 0 to LTagList.length - 1 do
    if Pos( 'pagination_next', LTagList.item(iPath).className ) > 0
      then Result := LTagList.item(iPath).href;

  // Burada diğer parse işlemlerini yapıyoruz vs....
  aList.Add( Format('This Page : %s', [aWB.LocationURL]) );
  aList.Add( Format('Next Page : %s', [Result]) );
  aList.Add( StringOfChar('-',100) );
end;

Kullanımı :
procedure TForm1.BitBtn1Click(Sender: TObject);
var
  LPageNo : Integer;
  LNewUrl : String;
begin
  WebBrowser1.Silent := True;

  // Genel Programlama
  LNewUrl := 'https://www.delphican.com/forumdisplay.php?fid=6';
  LPageNo := 1;
  while (LPageNo < SpinEdit1.Value) AND (LNewUrl <> '') do
  begin
    WebBrowser1.Navigate( LNewUrl );
    while WebBrowser1.ReadyState <> READYSTATE_COMPLETE do
    begin
      Application.ProcessMessages;
      Sleep(100);
    end;

    LNewUrl := ParsePage( WebBrowser1, Memo1.Lines, LPageNo );
  end;
  Showmessage('OK');

end;





hrlvgxvckvb3qzo5uub1.gif
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#6
function SourceGetParse(WebLink: string; MainTag: string; FirstTag: string; LastTag: string; FromTarget: TStringList): boolean;
var
 aClient         : System.Net.HttpClientComponent.TNetHTTPClient;
 LinkSource      : TStringList;
 MainTagPosCount : integer;
 FirstTagPosCount: integer;
 LastTagPosCount : integer;
 FirstTagLen     : integer;
 MainTagLen      : integer;
 LastTagLen      : integer;
 DesiredArea     : string;
begin
 try
   try
     LinkSource := TStringList.Create;
     aClient    := TNetHTTPClient.Create(nil);
     try

       LinkSource.Text := aClient.Get(WebLink).ContentAsString();

       MainTagLen  := Length(MainTag);
       FirstTagLen := Length(FirstTag);
       LastTagLen  := Length(LastTag);

       while Pos(MainTag, LinkSource.Text) > 0 do
       begin
         LinkSource.Text := Copy(LinkSource.Text, Pos(MainTag, LinkSource.Text) + MainTagLen, LinkSource.Text.Length);
         LinkSource.Text := Copy(LinkSource.Text, Pos(FirstTag, LinkSource.Text) + FirstTagLen, LinkSource.Text.Length);
         LastTagPosCount := Pos(LastTag, LinkSource.Text);
         DesiredArea     := Copy(LinkSource.Text, 0, LastTagPosCount - LastTagLen);

         FromTarget.Add(DesiredArea);
       end;

     finally
       Result := true;
     end;
   except
     Result := false;
   end;
 finally
   FreeAndNil(aClient);
   FreeAndNil(LinkSource);
 end;

end;

System.Net.HttpClientComponent

var
 veri: TStringList;
begin
 veri := TStringList.Create;
 try
   SourceGetParse('https://www.youtube.com/watch?v=uYv02OiPqhY', '"},"title":{"simpleText":', '"', '"', veri);
   Memo1.Text := veri.Text;
 finally
   FreeAndNil(veri);
 end;
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Resime kendi etrafın dönme animasyonu verme HakanY 3 2.403 02-11-2021, Saat: 10:07
Son Yorum: RAD Coder



Konuyu Okuyanlar: 1 Ziyaretçi