Parse Kod Sorunum

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
bkantur
Üye
Mesajlar: 47
Kayıt: 23 Kas 2013 04:45
Konum: Balıkesir

Parse Kod Sorunum

Mesaj gönderen bkantur »

Bu web kodları içerisinde istediğim kısımları alttaki kodlar ile alıyorum ama bunun daha kısa ve az kod ile yapılma ihtimali var mı acaba ?

Kod: Tümünü seç

<table class="uk-table uk-table-middle uk-table-hover">
<thead>
<tr>
<th class=""></th>
<th class="uk-width-large-2-10 uk-width-xlarge-2-10 uk-width-medium-2-10 uk-hidden-small">Beyan No</th>
<th class="uk-width-large-2-10 uk-width-xlarge-2-10 uk-width-medium-3-10 uk-width-small-1-2">Borç Türü</th>
<th class="uk-width-large-1-10 uk-width-xlarge-1-10 uk-width-medium-2-10 uk-hidden-small">Dönem</th>
<th class="uk-width-large-3-10 uk-width-xlarge-3-10 uk-width-medium-3-10 uk-text-left uk-hidden-small">Son Ödeme Tarihi</th>
<th class="uk-width-large-2-10 uk-width-xlarge-2-10 uk-width-medium-2-10 uk-width-small-1-2 uk-text-right">Fatura Tutarı</th>
</tr>
</thead>
<tbody>
<tr id="content_InvoiceRepeater_InvoiceRow_0" data-invoice-status="1" data-invoice-accuary="29677440-1" data-invoice-amount="24,71">  
<td><i class="uk-icon-check uk-hidden"></i></td>
<td class="uk-hidden-small">180033841</td>
<td>Dönemsel
<div class="uk-visible-small">
<div>180033841</div>
<div><i>31 Temmuz 2014, Perşembe</i> </div>
</div>
</td>
<td class="uk-hidden-small">201407</td>
<td class="uk-text-left uk-hidden-small">31 Temmuz 2014, Perşembe</td>
<td class="uk-text-right">24,71 <i class="uk-icon-try"></i></td>
</tr>
<tr id="content_InvoiceRepeater_InvoiceRow_1" data-invoice-status="1" data-invoice-accuary="29677438-1" data-invoice-amount="28,95">  
<td><i class="uk-icon-check uk-hidden"></i></td>
<td class="uk-hidden-small">180033841</td>
<td>Dönemsel
<div class="uk-visible-small">
<div>180033841</div>
<div><i>30 Eylül 2014, Salı</i> </div>
</div>
</td>
<td class="uk-hidden-small">201409</td>
<td class="uk-text-left uk-hidden-small">30 Eylül 2014, Salı</td>
<td class="uk-text-right">28,95 <i class="uk-icon-try"></i></td>
</tr>
<tr id="content_InvoiceRepeater_InvoiceRow_2" data-invoice-status="1" data-invoice-accuary="15286334-1" data-invoice-amount="47,66">  
<td><i class="uk-icon-check uk-hidden"></i></td>
<td class="uk-hidden-small">180033841</td>
<td>Dönemsel
<div class="uk-visible-small">
<div>180033841</div>
<div><i>31 Aralık 2014, Çarşamba</i> </div>
</div>
</td>
<td class="uk-hidden-small">201412</td>
<td class="uk-text-left uk-hidden-small">31 Aralık 2014, Çarşamba</td>
<td class="uk-text-right">47,66 <i class="uk-icon-try"></i></td>
</tr>
<tr id="content_InvoiceRepeater_InvoiceRow_3" data-invoice-status="1" data-invoice-accuary="15662477-1" data-invoice-amount="21,62">
<td><i class="uk-icon-check uk-hidden"></i></td>
<td class="uk-hidden-small">180033841</td>
<td>Dönemsel
<div class="uk-visible-small">
<div>180033841</div>
<div><i>27 Şubat 2015, Cuma</i> </div>
</div>
</td>
<td class="uk-hidden-small">201502</td>
<td class="uk-text-left uk-hidden-small">27 Şubat 2015, Cuma</td>
<td class="uk-text-right">21,62 <i class="uk-icon-try"></i></td>
</tr>
<tr id="content_InvoiceRepeater_InvoiceRow_4" data-invoice-status="1" data-invoice-accuary="16388954-1" data-invoice-amount="21,7">
<td><i class="uk-icon-check uk-hidden"></i></td>
<td class="uk-hidden-small">180033841</td>
<td>Dönemsel
<div class="uk-visible-small">
<div>180033841</div>
<div><i>30 Nisan 2015, Perşembe</i> </div>
</div>
</td>
<td class="uk-hidden-small">201504</td>
<td class="uk-text-left uk-hidden-small">30 Nisan 2015, Perşembe</td>
<td class="uk-text-right">21,7 <i class="uk-icon-try"></i></td>
</tr>
<tr id="content_InvoiceRepeater_InvoiceRow_5" data-invoice-status="1" data-invoice-accuary="17328021-1" data-invoice-amount="26,58">  
<td><i class="uk-icon-check uk-hidden"></i></td>
<td class="uk-hidden-small">180033841</td>
<td>Dönemsel
<div class="uk-visible-small">
<div>180033841</div>
<div><i>30 Haziran 2015, Salı</i> </div>
</div>
</td>
<td class="uk-hidden-small">201506</td>
<td class="uk-text-left uk-hidden-small">30 Haziran 2015, Salı</td>
<td class="uk-text-right">26,58 <i class="uk-icon-try"></i></td>
</tr>
<tr id="content_InvoiceRepeater_InvoiceRow_6" data-invoice-status="1" data-invoice-accuary="18525704-1" data-invoice-amount="39,72">  
<td><i class="uk-icon-check uk-hidden"></i></td>
<td class="uk-hidden-small">180033841</td>
<td>Dönemsel
<div class="uk-visible-small">
<div>180033841</div>
<div><i>30 Eylül 2015, Çarşamba</i> </div>
</div>
</td>
<td class="uk-hidden-small">201509</td>
<td class="uk-text-left uk-hidden-small">30 Eylül 2015, Çarşamba</td>
<td class="uk-text-right">39,72 <i class="uk-icon-try"></i></td>
</tr>
<tr id="content_InvoiceRepeater_InvoiceRow_7" data-invoice-status="1" data-invoice-accuary="73928026-1" data-invoice-amount="34,16">  
<td><i class="uk-icon-check uk-hidden"></i></td>
<td class="uk-hidden-small">180033841</td>
<td>Dönemsel
<div class="uk-visible-small">
<div>180033841</div>
<div><i>29 Ocak 2016, Cuma</i> </div>
</div>
</td>
<td class="uk-hidden-small">201601</td>
<td class="uk-text-left uk-hidden-small">29 Ocak 2016, Cuma</td>
<td class="uk-text-right">34,16 <i class="uk-icon-try"></i></td>
</tr>

Kod: Tümünü seç

Procedure TForm1.Button1Click(Sender: TObject);
var
  strGecici, strAra    : String;
  strGecici1, strAra1  : String;
  strGecici2, strAra2  : String;
  i : Integer;
  kaynakcik, kaynakcik1, kaynakcik2 :TStringList;
begin
  kaynakcik  := TStringList.Create;
  kaynakcik1 := TStringList.Create;
  kaynakcik2 := TStringList.Create;
  try
    begin
      strGecici := faturaweb.OleObject.Document.Body.InnerHTML;
      while Pos( '<td class="uk-hidden-small">', strGecici ) > 0 do
      begin
        strAra := '<td class="uk-hidden-small">';
        System.Delete(strGecici, 1, Pos(strAra, strGecici) + Length(strAra)-1 );
           strAra := '<td class="uk-hidden-small">';
           System.Delete(strGecici, 1, Pos(strAra, strGecici) + Length(strAra)-1 );
        kaynakcik.Add( Copy(strGecici, 1, Pos('</td>', strGecici)-1 ) );
      end;
      strGecici1 := faturaweb.OleObject.Document.Body.InnerHTML;
      while Pos( '<td class="uk-text-left uk-hidden-small">', strGecici1 ) > 0 do
      begin
        strAra1 := '<td class="uk-text-left uk-hidden-small">';
        System.Delete(strGecici1, 1, Pos(strAra1, strGecici1) + Length(strAra1)-1 );
        kaynakcik1.Add( Copy(strGecici1, 1, Pos('</td>', strGecici1)-1 ) );
      end;
      strGecici2 := faturaweb.OleObject.Document.Body.InnerHTML;
      while Pos( '<td class="uk-text-right">', strGecici2 ) > 0 do
      begin
        strAra2 := '<td class="uk-text-right">';
        System.Delete(strGecici2, 1, Pos(strAra2, strGecici2) + Length(strAra2)-1 );
        kaynakcik2.Add( Copy(strGecici2, 1, Pos('<i class="uk-icon-try">', strGecici2)-1 ) );
      end;
      for i := 0 to kaynakcik.Count -1 do
        begin
          Memo4.Lines.Add(kaynakcik.Strings[0]);
          kaynakcik.Delete(0);
          Memo4.Lines.Add(kaynakcik1.Strings[0]);
          kaynakcik1.Delete(0);
          Memo4.Lines.Add(kaynakcik2.Strings[0]);
          kaynakcik2.Delete(0);
        end;
    end;
  finally
    kaynakcik.Free;
    kaynakcik1.Free;
    kaynakcik2.Free;
  end;
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Parse Kod Sorunum

Mesaj gönderen Lord_Ares »

Benim idda sitesinden bilgi çekmekte kullandığım aşağıdaki gibi bir prosedürüm var. Prosedürün içerisindeki değişkenleri kendine göre değiştirirsin
aşağıdaki prosedür ile , sayfada bulmak istediğin classları bulabilir içindeki yazıları alabilirsin. (Örneğin sayfada class adı deneme olanları bul içindeki yazıyı getir gibi...)


USESA EKLENECEK >>>> uses mshtml,comobj;

Kod: Tümünü seç

procedure Getir(const kodu,adi,tahmini: string);// 

var
  Doc:IDispatch;
  Document: IHTMLDocument2;
  Body: IHTMLElement2;
  Tags: IHTMLElementCollection;
  Tag: IHTMLElement;
  I: Integer;
  mackodu,takimadi,tahminleri,sitesi:string; 
 begin

                      Doc:=Form1.WebBrowser1.Document;

                      if not Supports(Doc, IHTMLDocument2, Document) then exit;
                      if not Supports(Document.body, IHTMLElement2, Body) then exit;
                      Tags := Body.getElementsByTagName('*');
                      for I := 0 to Pred(Tags.length) do
                      begin
                        Tag := Tags.item(I, EmptyParam) as IHTMLElement;

                        if AnsiSameText(Tag._className, kodu) then
                        begin
                             mackodu:=Tag.innerText;
                             
                        end;

                        if AnsiSameText(Tag._className, adi) then
                        begin
                             takimadi:=Tag.innerText;
                             
                        end;

                        if AnsiSameText(Tag._className, tahmini) then
                        begin
                                tahminleri:=Tag.innerText;

                                  Form1.Memo1.Lines.Add(mackodu +'  '+ takimadi+'  '+ tahminleri);

                        end;

  end;

 end;

Kullanım şekline örnek

Kod: Tümünü seç

 Getir('col1','col4','col5'); // burada diyoruz ki bana class adı col1 , col4,col5 olanları bul ve içindeki yazıları getir.
 

Kolay gelsin
bkantur
Üye
Mesajlar: 47
Kayıt: 23 Kas 2013 04:45
Konum: Balıkesir

Re: Parse Kod Sorunum

Mesaj gönderen bkantur »

Çok teşekkür ederim. Tam amacına ulaşan kısa bir kod.
bkantur
Üye
Mesajlar: 47
Kayıt: 23 Kas 2013 04:45
Konum: Balıkesir

Re: Parse Kod Sorunum

Mesaj gönderen bkantur »

Parse kısmında sorunum kalmadı ama şimdide alttaki kodda
Borcu yoksa sorunsuz bir şekilde tamamlanıyor
ama sicil numarası yanlışsa veya borcu varsa program kilitleniyor nerede hata yapıyorum acaba

Kod: Tümünü seç

deger:= trim(html_temizle(aradansec(sorgusonucukaynak, '<i class="uk-icon-bell">' , '</div>')));
  if (deger='Bu sicil numarasına ait ödenmemiş fatura bulunmamaktadır.') then
    begin
       showmessage(deger);   
       statPRG.progress:=100;
       statLB.Caption:='Sorgulama Başarıyla Tamamlandı...';
       statPAN.visible:=false;
       temizle;   
    end
  else
    begin
      deger1:= trim(html_temizle(aradansec(sorgusonucukaynak, 'id="content_InvalidDataPanel">' , '</div>')));      
      if (deger1='Girdiğiniz sicil numarası hatalı.') then
         begin
            ShowMessage(deger1);  
            statPRG.progress:=100;
            statLB.Caption:='Sorgulama Başarıyla Tamamlandı...';
            statPAN.visible:=false;
            temizle;           
         end
       else
         begin 
             statPRG.progress:=100;
             statLB.Caption:='Sorgulama Başarıyla Tamamlandı...';
             statPAN.visible:=false;   
             Getir('uk-hidden-small','uk-text-left uk-hidden-small','uk-text-right');
             sorguaktar;    
         end;
    end;	
    
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Parse Kod Sorunum

Mesaj gönderen Lord_Ares »

if bloklarını değiştirmelisin, hem borç hem sicil noları tek bir if else ile değilde, ayrı ayrı yap veya

Kod: Tümünü seç

if (deger='Bu sicil numarasına ait ödenmemiş fatura bulunmamaktadır.') and ((deger1='Girdiğiniz sicil numarası hatalı.')) then
begin
/// yani diyoruz ki borcu yoksa ve girdiği sicil hatalı ise bunu yap
end;

if if (deger='Bu sicil numarasına ait ödenmemiş fatura var.') and ((deger1=' sicil numarası doğru.')) then
begin
//// borcu var ve sicil no doğru ise şunları yap gibii
end;
Benim sana tavsiyem böyle çok karışık olur, en güzeli sicil noyu kontrol eden bir fonksiyon yap. Fonksiyondan dönen değer true ise borcu varmı yokmu kontrol et . İşte bu kısımda if begin end else diyerek gitmen daha doğru olur. Yukarıdaki kodlarına baktığımda sicil no yanlış ve doğru ise yapılacaklar var ama nerede var borcu yoksa kısmında var. Borcu varsa diye kontrol ettiğin bir yer yok. Yani if bloklarını yanlış yerlere kullanmışsın :)))

Kod: Tümünü seç

  if (deger1='Girdiğiniz sicil numarası hatalı.') then // bu kısım else bloğunda. Yanlış yerde, Haliyle borcu varsa kontrolünü yapamıyor
Cevapla