C# Web Sitesinden Veri Çekmek (HmtlAgilityPack Kullanımı) ile HTML Parse Etme
http://www.yazilimdilleri.net/YazilimMakale-3138-C--Web-Sitesinden-Veri-Cekmek--HmtlAgilityPack-Kullanimi--ile-HTML-Parse-Etme.aspx
Bir uygulama yazmanız gerekiyor. Ve uygulamanızın sürekli son kullanıcıya veri göstermesi gerekiyor. Ancak verileri kendiniz üretmiyorsanız ve başka bir web sayfasından veri çekmek istiyorsanız burada HtmlAgilityPackyardımınıza koşuyor.
Hemen Visual Studio'dan C# Dilinde bir Console App açalım. Öncelikle HtmlAgilityPack'i uygulamamızın içine eklememiz gerekiyor. Bunu nuget vasıtasıyla yapabiliriz. Nuget'i açmak için Tools>Library Package Manager>Manage Nuget Packages for Solution yolunu izleyin. Daha sonra gelen pencerenin sol üst kısmındaki arama kısmına htmlagilitypack diye aratırsanız(online) nuget htmlagilitypack'i bulacaktır. Install'a tıklayarak projenizde kullanmak üzere htmlagilitypack'i kurabilirsiniz.
Kurulum aşaması bittikten sonra kodlamaya geçebiliriz. Öncelikle uygulamanızın namespace'lerine aşağıdakileri eklemeniz gerekiyor.
using System.Net;
using HtmlAgilityPack;
Benim üniversitemde rss veya başka bir çözüm olmadığından öğrencilere haber verilen sayfayı parse etmem gerekiyor. Daha sonra ise haber sayfasından parse ettiğim linklerin başlıklarını uygulamamda son kullanıcıya göstermem gerekiyor. Üniversitemin sayfasında yayınlanan haberlerin sayfası ise
http://habermerkezi.cu.edu.tr/kampustum.asp 'dir.
Yukarıda belirttiğim sayfadaki linklerin başlıklarını alıp, uygulamama getirmem gerekiyor.
HtmlAgilityPack.HtmlDocument htmldoc = new HtmlAgilityPack.HtmlDocument();
htmldoc.LoadHtml(html); //İndirilen Html kodları, yukarıda oluşturulan htmlagilitypack'den türetilen htmldocument nesnesine aktarılıyor...
HtmlNodeCollection basliklar = htmldoc.DocumentNode.SelectNodes("//a");
//İstediğimiz Element'in özelliğini yani filtrelemeyi yapacağımız alan...
List<string> liste=new List<string>();//Gelen veriyi saklayacağımız alan String tipinden oluşturuluyor.
foreach (var baslik in basliklar)
{
liste.Add(baslik.InnerText); //Parse ettiğimiz linklerin üzerinde yazan yazılar dizi halinde listeye ekleniyor...
}
for (int i = 0; i < liste.Count; i++)
{
Console.WriteLine(liste[i]); //Basit bir döngü ile aldığımız veriler ekrana yazılıyor...
}
Console.ReadLine(); //Ekran beklemede :)
Ancak bir sorunumuz var. Yukarıdaki DocumentNode.SelectNodes("//a") kısmında sayfadaki tüm linkler çağrılıyor. Bu istenmeyen bir durum. Öyleyse filtrelemeyi değiştirmemiz gerekiyor. Filtrelemedeki kullanacağımız XPath'i çıkartmak için linklerden birine sağ tıklayıp ögeyi denetleye tıklarsanız karşınıza linkin içerisinde bulunduğu Html kodları gelecektir. Buradan sırasıyla Xpath'i elle yazabiliriz.
HtmlNodeCollection basliklar = htmldoc.DocumentNode.SelectNodes("//p/strong/a");
Linkler ekranımıza dökülmeye başladı :)
HtmlAgilityPack ile Html dökümanından çağıracağımız verileri özelliklerine göre filtreleyebiliriz. Örneğin classözelliği "solmenu" olan elemanları uygulamamıza çağırmak için kodumuzu aşağıdaki gibi değiştirmeliyiz.
HtmlNodeCollection basliklar = htmldoc.DocumentNode.SelectNodes("//a[@class='solmenu']");
Burada görüleceği gibi class'ı "solmenu" olan elemanları çağırıyoruz.
Xpath ile daha detaylı bilgilere
buradan ulaşabilirsiniz.
Umarım faydalı bir makale olmuştur. Sorularınız olursa iletin, cevaplayayım.
Hiç yorum yok :
Yorum Gönder