Pos veya Ansipos fonksiyonu..

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Pos veya Ansipos fonksiyonu..

Mesaj gönderen Lord_Ares »

html parse ederken pos veya ansipos kullanıyorum fakat düzgün çalışmıyor. mesela </ karakterini aratırken değer boş dönüyor fakat sadece < bunu aratırsam buluyor. daha bunun gibi birçok karakteri aratırken sorun yaşıyorum bu konu hakkında fikri olan varmı nasıl parse etmeliyim veya bunu düzgün yaparn bir komponent varmı yazdığım kod şu şekilde hatamı yapıyorum fikir verirmisiniz.


var
sayfakodu,aranacakyer:WideString;
kodbaslangic,kodsonu :integer;

begin
aranacakyer:=ANA.WebBrowser1.OleObject.document.body.innerHTML;
kodbaslangic:=AnsiPos('?newdid=',aranacakyer);
Delete(aranacakyer,0,kodbaslangic);
kodsonu:=AnsiPos('>',aranacakyer);
sayfakodu:=copy(aranacakyer,kodbaslangic,kodsonu-1);
ana.memo2.Clear;
ana.memo2.Text:=sayfakodu;

end;
Kullanıcı avatarı
csunguray
Üye
Mesajlar: 855
Kayıt: 09 Ara 2006 05:08
Konum: Adana
İletişim:

Mesaj gönderen csunguray »

AnsiPos bozuk. Yanlış çalışıyor. Ben uzun zaman trmaladım. En son kendi pos umu yazdım. Benim yazdığım yavaş çalışıyor ama doğru çalışıyor en azından.
C. Sunguray
csunguray at netbilisim.kom
Net Bilişim Hizmetleri

Sıradan her programcı bilgisayarın anlayabileceği kodlar yazabilir.
Sadece iyi programcılar insanların da anlayabileceği kodlar yazarlar.
Martin Fowler (http://martinfowler.com/)
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Bugüne kadar yüzlerce parse fonksiyon yazdım ve tümünde de POS fonksiyonu sorunsuz görevini yerine getirdi. Özel fikrim, sorgulama kriterinizi yeniden gözden geçirin.

Olası yaptığınız hata, sayfa html içeriğinin doluluk oranına göre farklı ihtimalleri değerlendirmeyerek, birden fazla tag içerisinden hedefinize ulaşmadan hemen önceki bir tanesinin konumunu alıyor olabilirsiniz.

Örneğin şöyle çalışın. Aşağıdaki gibi adım adım kaynak kodu eriterek ilerleyin.

Kod: Tümünü seç

Var
  AranacakYer, Ara, SayfaKodu : String;
begin
  aranacakyer := ANA.WebBrowser1.OleObject.document.body.innerHTML;
  Ara := '?newdid=';
  If Pos(Ara, AranacakYer) > 0 then begin
    System.Delete( AranacakYer, 1, Pos(Ara, AranacakYer) + Length(Ara)-1);
    SayfaKodu := Copy(AranacakYer, 1, Pos('>', AranacakYer)-1);
    ANA.Memo2.Clear;
    ANA.Memo2.Text := SayfaKodu;
  end else ANA.Memo2.Text := '? Kod Bulunamadı ?';
end;
Resim
Resim ....Resim
Kullanıcı avatarı
Battosai
Üye
Mesajlar: 1316
Kayıt: 01 Eki 2007 12:02
Konum: Ankara

Mesaj gönderen Battosai »

Pos fonksiyonu çalışmıyor demek talihsiz bir açıklama olmuş. Kodlar doğru sonucu vermiyor diye pos'da sorun var demek oldukça yanlış..zira burdaki acemi arkadaşlar yazıyı görüp Pos'a küsebilir:) Pos fonksiyonu büyük küçük harf ayrımı yapar bir çok arkadaş bu yüzden yanılgıya düşebiliyor...
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Mesaj gönderen Lord_Ares »

sayın mrmarman fikriniz için teşekkürler bu şekilde deniyeyim inşallah olur
Battosai arkadaşım, bende zaten pos fonksiyonu kesin çalışmıyor demedim yazdığım mesajda " html parse ederken " dedim ve yazdığım kod satırını alttarafa ekledim burda kastım ya kodumda bir yanlışlık var yada pos fonksiyonunu düzgün kullanamıyorum. ayrıca en altta html parse fikri olan varmı diyerek konuyu tamamladım sanırım beni yanlış anladın.Bu konu hakkında seninde fikrin varsa paylaşırsan sevinirim.

pos fonksiyon ile şunu denedim bulmak istediğiim şey " işareti bunu webbrowserden gelen html sayfanın içeriğini değişkene atarak gelen veri içinde arattırdım ve bu değişken içerisinde pos fonksiyonu bana hep boş değer döndürdü daha sonra gelen veriyi bir adet memo içine attım aynı kodla bu seferki aramamda buldu biraz araştırdım ve söylenenler şu şekilde ( html tag lerini aratırken bazı tag işaretlerini dil kodlaması farklılıklarından dolayı bulamıyor bu yüzden Bu tür taglerin asci kodunu yazarak arattırın ) bu doğru olabilirmi. küçük büyük harf duyarlılığını yapan ansipos fonksiyonudur.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Küçük büyük farkına takılmana lüzum yok. UpperCase fonksiyonunu POS fonksiyonu içine dahil ederek kullanabilirsin

Örnek :

Kod: Tümünü seç

Var 
  AranacakYer, Ara, SayfaKodu : String; 
begin 
  aranacakyer := ANA.WebBrowser1.OleObject.document.body.innerHTML; 
  Ara := '?newdid='; 
  If Pos(UpperCase(Ara), UpperCase(AranacakYer)) > 0 then begin 
    System.Delete( AranacakYer, 1, Pos(UpperCase(Ara), UpperCase(AranacakYer)) + Length(Ara)-1); 
    SayfaKodu := Copy(AranacakYer, 1, Pos('>', AranacakYer)-1); 
    ANA.Memo2.Clear; 
    ANA.Memo2.Text := SayfaKodu; 
  end else ANA.Memo2.Text := '? Kod Bulunamadı ?'; 
end;
Resim
Resim ....Resim
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Mesaj gönderen ikutluay »

Battosai yazdı:Pos fonksiyonu çalışmıyor demek talihsiz bir açıklama olmuş. Kodlar doğru sonucu vermiyor diye pos'da sorun var demek oldukça yanlış..zira burdaki acemi arkadaşlar yazıyı görüp Pos'a küsebilir:) Pos fonksiyonu büyük küçük harf ayrımı yapar bir çok arkadaş bu yüzden yanılgıya düşebiliyor...
csunguray pos dememişki. ansipos demiş.

delphiyi yazanlar hata yapamaz diye bir kural yokki üstad. ansipos u denemedim ama csunguray denemeden talihsiz açıklama yazacak birisi değildir.
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Mesaj gönderen Lord_Ares »

sayın mrmarman yukarıda vermiş olduğunuz kod ile istediğim bilgiyi buluyorum fakat şöyle bir sorun

Var
AranacakYer, Ara, SayfaKodu : String;
begin
aranacakyer := WebBrowser1.OleObject.document.body.innerHTML;
Ara := 'related:';
If Pos(Ara, AranacakYer) > 0 then begin
System.Delete( AranacakYer, 1, Pos(Ara, AranacakYer) + Length(Ara)-1);
SayfaKodu := Copy(AranacakYer, 1, Pos('/view', AranacakYer)-1);
Memo1.Clear;
Memo1.Text := SayfaKodu;
end else Memo1.Text := '? Kod Bulunamadı ?';
end;



burda aranacak yer değişkenine html içeriği alıyorum ve ara değişkeninde tanımlı olanı buluyor bir memoya atıyoruz. sorun şu ki benim ara değişkeni ile aradığım değerden bir sürü var ve ben sayfanın sonuna kadar sırayla hepsini almak istiyorum buna nasıl bir döngü yaparım.


ornek sayfa kodu

"href="http://x1.com.html"
"href="http://x2.com.html"
"href="http://x3.com.html"

ara:='href='


vermiş olduğunuz kodla ilkini alıyor ikincisini alamıyorum her seferinde sayfanın kodunu değişkene tekarak yüklemek ve ilk bulduğum değerin sonuna kadar olan kısmı silip yeni değişkene atmak zorunda kalıyorum fakat aradığım alanın sonu nerde bitiyor bilmediğim için program bir yerden sonra hata veriyor. End of gibi komutla kontrol edemiyorum
nasıl yapabilirim fikriniz varmı.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Daha önce de dediğim gibi HTML kod içerisinde unique yani tekil kısımlar bulmalısın. İllaki de kod olmak zorunda değil başlık vs. de olabilir. İstediğin kodun başında "Adı :" ifadesi de olabilir. Sonuçta bir tablo ise <table> ile başlar ve td veya tr ile bloklar halinde bulunurlar. Sen </td> sayısına bakarak satır sütun ilişkisini bildiğin bir tablodaki aradığın başlıktan sonra kaçıncı satırda veya sütunda bilgi bulacağını daha önceden etüd edebilir kararlaştırabilirsin. PARSE işlemi böyle bişeydir. Dersini iyi çalışırsan sana bilgileri sunar, çalışmazsan sorgun kısa veya uzun kalacağından yan sonuç boş döner ya da anlamsız kelime veya karakterler... :wink:
Resim
Resim ....Resim
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Pos veya Ansipos fonksiyonu..

Mesaj gönderen Lord_Ares »

mrmarman hocam vermiş olduğunuz bu kod hakkında birşey sormak istiyorum.
verdiğiniz kod ile herhangi bir htm sayfanın içeriğini alıp arama yapabiiliyorum. Bu harika kod için teşekkür ediyorum uzun suredir kullanıyorum, sormak istediğim şey , bu gun bir site üzerinde kodu kullanmak istedim fakat gördümki site 3 bölüme ayrılmış, index.htm sayfası ust, sol ve orta olarak 3 bölüme ayrılmış,sol sayfanın kaynak kodu farklı , orta sayfanın kaynak kodu farklı. benim bilgi almak istediğim yer sitenin orta sayfasında.


aranacakyer := WebBrowser1.OleObject.document.body.innerHTML;

kodun bu kısmında, orta sayfanın kaynak kodunu al içinde ara nasıl diyebiliriz.

bilen arkdaşlar varsa yardım ederse sevinirim.

teşekkürler.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Pos veya Ansipos fonksiyonu..

Mesaj gönderen mrmarman »

Bir html sayfada FORMS(0...n) olduğu gibi FRAMES(0..n) şeklinde bölümlemeler olabilir hatırlatalım. Aşağıdaki senin için hazırladığım örnekte her form item için ayrı ayrı InnerHTML kodu için delphi kod satırını, ardından da her bir form içindeki Element listesini yine delphi kod satırı olarak göreceksin.

Kod: Tümünü seç

procedure TForm1.BitBtn1Click(Sender: TObject);
Var
  i,j : Integer;
begin
  WebBrowser1.Navigate('http://divxplanet.com/');
  while WebBrowser1.ReadyState <> ReadyState_Complete do Application.ProcessMessages;
  Memo1.Lines.Clear;
  if WebBrowser1.OleObject.Document.Frames.Length > 0 then begin
    Memo1.Lines.Add('');
    Memo1.Lines.Add('-----------------------------');
    Memo1.Lines.Add('FRAMES bilgileri');
    Memo1.Lines.Add('-----------------------------');
    for i := 0 to WebBrowser1.OleObject.Document.Frames.Length - 1 do
    begin
      Memo1.Lines.Add( Format('WebBrowser1.OleObject.Document.Frames.Item(%d)', [i]) );
    end;
  end;

  if WebBrowser1.OleObject.Document.Forms.Length > 0 then begin
    Memo1.Lines.Add('');
    Memo1.Lines.Add('-----------------------------');
    Memo1.Lines.Add('FORMS bilgileri');
    Memo1.Lines.Add('-----------------------------');
    for i := 0 to WebBrowser1.OleObject.Document.Forms.Length - 1 do
    begin
      Memo1.Lines.Add( Format('WebBrowser1.OleObject.Document.Forms.Item(%d).Document.Body.InnerHTML', [i]) );
      for j := 0 to WebBrowser1.OleObject.Document.Forms.Item(i).Elements.Length - 1 do begin
        Memo1.Lines.Add( Format('  WebBrowser1.OleObject.Document.Forms.Item(%d).Elements.Item(%d).Name -> ''%s'' ', [i, j, WebBrowser1.OleObject.Document.Forms.Item(i).Elements.Item(j).Name ]) );
      end;
    end;
  end;
  ShowMessage('Bitti');
end;
Sonuç :

Kod: Tümünü seç

-----------------------------
FRAMES bilgileri
-----------------------------
WebBrowser1.OleObject.Document.Frames.Item(0)
WebBrowser1.OleObject.Document.Frames.Item(1)

-----------------------------
FORMS bilgileri
-----------------------------
WebBrowser1.OleObject.Document.Forms.Item(0).Document.Body.InnerHTML
  WebBrowser1.OleObject.Document.Forms.Item(0).Elements.Item(0).Name -> 'CookieDate' 
  WebBrowser1.OleObject.Document.Forms.Item(0).Elements.Item(1).Name -> 'referer' 
  WebBrowser1.OleObject.Document.Forms.Item(0).Elements.Item(2).Name -> 'UserName' 
  WebBrowser1.OleObject.Document.Forms.Item(0).Elements.Item(3).Name -> 'PassWord' 
  WebBrowser1.OleObject.Document.Forms.Item(0).Elements.Item(4).Name -> 'Hatirla' 
  WebBrowser1.OleObject.Document.Forms.Item(0).Elements.Item(5).Name -> '' 
WebBrowser1.OleObject.Document.Forms.Item(1).Document.Body.InnerHTML
  WebBrowser1.OleObject.Document.Forms.Item(1).Elements.Item(0).Name -> 'cx' 
  WebBrowser1.OleObject.Document.Forms.Item(1).Elements.Item(1).Name -> 'ie' 
  WebBrowser1.OleObject.Document.Forms.Item(1).Elements.Item(2).Name -> 'oe' 
  WebBrowser1.OleObject.Document.Forms.Item(1).Elements.Item(3).Name -> 'cof' 
  WebBrowser1.OleObject.Document.Forms.Item(1).Elements.Item(4).Name -> 'hl' 
  WebBrowser1.OleObject.Document.Forms.Item(1).Elements.Item(5).Name -> 'q' 
  WebBrowser1.OleObject.Document.Forms.Item(1).Elements.Item(6).Name -> 'sa' 
WebBrowser1.OleObject.Document.Forms.Item(2).Document.Body.InnerHTML
  WebBrowser1.OleObject.Document.Forms.Item(2).Elements.Item(0).Name -> 'arama' 
  WebBrowser1.OleObject.Document.Forms.Item(2).Elements.Item(1).Name -> 'src_select' 
  WebBrowser1.OleObject.Document.Forms.Item(2).Elements.Item(2).Name -> '' 
WebBrowser1.OleObject.Document.Forms.Item(3).Document.Body.InnerHTML
  WebBrowser1.OleObject.Document.Forms.Item(3).Elements.Item(0).Name -> 'dailyf' 
  WebBrowser1.OleObject.Document.Forms.Item(3).Elements.Item(1).Name -> '' 
Resim
Resim ....Resim
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Pos veya Ansipos fonksiyonu..

Mesaj gönderen Lord_Ares »

hocam sende olmasan biz bitmişiz, çook teşekkür ediyorum. çok uzun zamandır aradığım çözmeye çalıştığım bir konuydu sayfadaki formları ve elementleri bulmak.

htm sayfada şöyle bir kod var. sayfada uret buttonuna tıkladığımızda küçük bir pencere açılıyor ve içerisinde bir adet combobox var. combobox tan uretmek istediğin miktarı seçiyorsun. pencerenin kodlama kısmnıdaki adı anzahl comboboxta seçebileceğin değerler de şu kod ile belirtiliyor option>10</option
delphide bu comboboxın içindeki verilerden herhangi birini şöyle seçtirebiliyorum.
//// birinci üretim için
Form1.WebBrowser1.Navigate( WideString('javascript:showAnzahl(1);') ); /// ilk uretim için comboboxın içinde olduğu kuçuk pencereyi açıyor
Form1.WebBrowser1.OleObject.Document.GetElementByID('anzahl').Value := '10';/// ureticek miktarı seçer


//// ikinci uretim için
Form1.WebBrowser1.Navigate( WideString('javascript:showAnzahl(2);') ); /// ilk uretim için comboboxın içinde olduğu kuçuk pencereyi açıyor
Form1.WebBrowser1.OleObject.Document.GetElementByID('anzahl').Value := '10';/// ureticek miktarı seçer


ilk uretim olarak belirttiğim aşağıdaki kod için bu çalışıyor. fakat onun altında bulunan ikinci uretim için çalışmıyor. sorun şu sanırım, ilk uretim produceNow11 isimli formda,
ikincisi produceNow12 formda bu yuzden ben ikincisi için option value gondermeye çalıştığımda option value birincisine gidiyor.

burada post olayını nasıl yapmalıyım.

şu şekilde nasıl derim. formid si produceNow12 olan formda ,select id si anzahl ' ın option value ' si 15 tir.


<!-- Kaufen layer erz 11 --> /////// ilk üretilen malzeme
<div id="refine_1" class="sellBox fliess11px-weiss">
<form id="produceNow11" action="indexInternal.es" method="post"><input type="hidden" name="reloadToken" value="9cc54b765599ee6782da164ec9653623">
<input type="hidden" name="action" value="internalLabor">
<input type="hidden" name="subAction" value="produce">
<input type="hidden" name="oreID" value="11">
<div class="box_choose_count">
<div class="box_choose_count_headline"><strong>Üret</strong></div>
<div class="box_choose_count_item">
<div class="box_choose_count_item_name">flex</div>
<div class="box_choose_count_item_cont">
<div>Kaç tane üretmek istiyorsun?</div>
<select name="anzahl" id="anzahl">
<option>1</option> <option>5</option> <option>10</option> <option value="21">azami 21</option>
</select>
</div>
</div>
</form>
</div>


<!-- Kaufen layer erz 12 -->////////////// ikinci uretilen malzeme
<div id="refine_2" class="sellBox fliess11px-weiss">
<form id="produceNow12" action="indexInternal.es" method="post"><input type="hidden" name="reloadToken" value="9cc54b765599ee6782da164ec9653623">
<input type="hidden" name="action" value="internalLabor">
<input type="hidden" name="subAction" value="produce">
<input type="hidden" name="oreID" value="12">
<div class="box_choose_count">
<div class="box_choose_count-item"><strong>Üret</strong></div>
<div class="box_choose_count_item">
<div class="box_choose_count_item_name"><strong>ekose</strong></div>
<div class="box_choose_count_item_cont">
<div>Kaç tane üretmek istiyorsun?</div>
<select name="anzahl" id="anzahl">
<option>1</option> <option>5</option> <option>10</option> <option value="15">azami 15</option>
</select>
</div>
</div>

</form>
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re:

Mesaj gönderen Lost Soul »

Lord_Ares yazdı:
burda aranacak yer değişkenine html içeriği alıyorum ve ara değişkeninde tanımlı olanı buluyor bir memoya atıyoruz. sorun şu ki benim ara değişkeni ile aradığım değerden bir sürü var ve ben sayfanın sonuna kadar sırayla hepsini almak istiyorum buna nasıl bir döngü yaparım.

.
viewtopic.php?p=147138#p147138
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Pos veya Ansipos fonksiyonu..

Mesaj gönderen Lord_Ares »

dostum ne demekistediğini anlayamadım , sanırım konunun sadece en ustunu okuduğun için bunu gönderdin. en son yazdığım iletide post ile gönderirken bir hata yapıyorum nasıl çözerim diye sormuştum. incelersen belki yardımcı olabilirsin.

yardımın için yinede teşekkürler
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Pos veya Ansipos fonksiyonu..

Mesaj gönderen Lord_Ares »

WebBrowser1.OleObject.Document.Forms.id('produceNow12').SelectElement.item.Name('anzahl').Value:=22;


şöyle göndermek istedim ama olmadı :)
Cevapla