Not: Bu makale bir önceki makalenin devamı olduğu halde okunurluğu kolaylaştırmak adına buradan devam edilmiştir.
Önceki makalede login olduğumuz sayfanın HTML kodlarını elde etmiştik. Şimdi ise HTML içerisinden istediğimiz kısımları elde edeceğiz. Örneğimizde delphican.com'u kullanmıştık. Ana sayfada Son Mesajlar bölümünü almaya çalışalım.
"HTML parse" için bir çok ücretli/ücretsiz çözümler mevcut. Ben yine Delphi dışından bir bileşene/kütüphaneye ihtiyaç duymamak için IHTMLDocument2 interface'ini kullanacağım. Bunun için projemize MSHTML unitini eklememiz yeterli.
Öncelikle bir önceki makaledeki fonksiyonumuzla web sitesine login olup HTML kodlarını alalım:
Artık sonuc_html içerisinde http://www.delphican.com/index.php sayfasının kaynak kodları var. Bunu parse edebileceğimiz formata dönüştürmeliyiz:
doc değişkenini tıpkı bir webbrowser gibi düşünebiliriz. İçerisinde body'i, tag'ları vs. olan ve bunlara erişebileceğimiz bir değişken. Örneğin bu sayfa içindeki tüm tablo satırlarına(HTML'deki TR) şu şekilde kolayca erişebiliriz:
Ana sayfadaki Son Mesajlar bölümüne bakarsanız orada 5 kolon olduğunu görürsünüz. Bu kolonlara da yukarıdakine benzer yöntemle şöyle ulaşabiliriz:
Son Mesajlar'ın html kodlarına baktığımızda TR taglarının class'larının "trow1 smalltext" olduğunu görürüz. Bundan faydalanarak sayfanın diğer kısımlarında bulunan TR'lerden bizim işimize yarayanları ayırt edebileceğiz.
Aslında gereksiz yere çok uzattım sanırım
Kodlar benden daha iyi anlatacaktır:
Bahsetmem gereken küçük bir nokta: "trow1 smalltext" sınıfına sahip TR taglarinden ilkinin Son Mesajlar bölümündeki başlıklar olması sebebiyle yukarıdaki kodda bunun kontrolü yapılmıştır.
Örnek ekran çıktısı:

Dipçe: Bir ekleme daha yapıp, kaynak kodları tabi ki paylaşacağım
Önceki makalede login olduğumuz sayfanın HTML kodlarını elde etmiştik. Şimdi ise HTML içerisinden istediğimiz kısımları elde edeceğiz. Örneğimizde delphican.com'u kullanmıştık. Ana sayfada Son Mesajlar bölümünü almaya çalışalım.
"HTML parse" için bir çok ücretli/ücretsiz çözümler mevcut. Ben yine Delphi dışından bir bileşene/kütüphaneye ihtiyaç duymamak için IHTMLDocument2 interface'ini kullanacağım. Bunun için projemize MSHTML unitini eklememiz yeterli.
Öncelikle bir önceki makaledeki fonksiyonumuzla web sitesine login olup HTML kodlarını alalım:
var
sonuc_html: string;
begin
sonuc_html := DoLogin('kullanıcı_adı', 'şifre');
if sonuc_html = '' then
begin
ShowMessage('login başarısız');
Exit;
end;
Artık sonuc_html içerisinde http://www.delphican.com/index.php sayfasının kaynak kodları var. Bunu parse edebileceğimiz formata dönüştürmeliyiz:
doc: OleVariant; begin doc := coHTMLDocument.Create as IHTMLDocument2; doc.write(sonuc_html); doc.close;
doc değişkenini tıpkı bir webbrowser gibi düşünebiliriz. İçerisinde body'i, tag'ları vs. olan ve bunlara erişebileceğimiz bir değişken. Örneğin bu sayfa içindeki tüm tablo satırlarına(HTML'deki TR) şu şekilde kolayca erişebiliriz:
satirlar: OleVariant;
//...
satirlar := doc.body.all.tags('TR');
Bu bize bir IHTMLElementCollection verir. İçerisinde html elemenlerinin bulunduğu bir liste. Bir döngü içerisinde bu liste içinde dolaşıp istediğimiz satırlar(TR) ile ilgilenebiliriz. Ana sayfadaki Son Mesajlar bölümüne bakarsanız orada 5 kolon olduğunu görürsünüz. Bu kolonlara da yukarıdakine benzer yöntemle şöyle ulaşabiliriz:
kolonlar: OleVariant;
//...
kolonlar:= satirlar.item(i).all.tags('TD');
Ben bu kolonlardan sadece 3 tanesini; Konu, Yazar, Forum kolonlarını alıp bunları ListView içerisinde göstermeyi seçtim. Son Mesajlar'ın html kodlarına baktığımızda TR taglarının class'larının "trow1 smalltext" olduğunu görürüz. Bundan faydalanarak sayfanın diğer kısımlarında bulunan TR'lerden bizim işimize yarayanları ayırt edebileceğiz.
Aslında gereksiz yere çok uzattım sanırım
Kodlar benden daha iyi anlatacaktır:
procedure TFrmMain.btnLoginClick(Sender: TObject);
var
doc: OleVariant;
satir, satirlar, kolonlar: OleVariant;
i,j: Integer;
sonuc_html, icerik: string;
ilk_satir: Boolean;
aItem: TListItem;
begin
sonuc_html := DoLogin('kullanıcı_adı', 'şifre');
if sonuc_html = '' then
begin
ShowMessage('login başarısız');
Exit;
end;
doc := coHTMLDocument.Create as IHTMLDocument2;
doc.write(sonuc_html);
doc.close;
ListView1.Clear;
ilk_satir := True;
ListView1.Items.BeginUpdate;
try
satirlar := doc.body.all.tags('TR');
for i := 0 to satirlar.length - 1 do
begin
satir := satirlar.item(i);
if satir.className = 'trow1 smalltext' then // sadece ilgili satırlara bak
begin
if ilk_satir then // ilk satırı atlıyoruz
begin
ilk_satir := False;
Continue;
end;
kolonlar := satir.all.tags('TD'); // satır içindeki tüm kolonlar
aItem := ListView1.Items.Add;
for j := 0 to kolonlar.length-1 do
begin
icerik := kolonlar.item(j).innerText;
case j of
0: aItem.Caption := icerik; // konu sütunu
2: aItem.SubItems.Add(icerik); // yazar sütunu
4: aItem.SubItems.Add(icerik); // forum sütunu
end;
end;
end;
end;
finally
ListView1.Items.EndUpdate;
end;
end;
Bahsetmem gereken küçük bir nokta: "trow1 smalltext" sınıfına sahip TR taglarinden ilkinin Son Mesajlar bölümündeki başlıklar olması sebebiyle yukarıdaki kodda bunun kontrolü yapılmıştır.
Örnek ekran çıktısı:

Dipçe: Bir ekleme daha yapıp, kaynak kodları tabi ki paylaşacağım
There's no place like 127.0.0.1


