C# Html Agility Pack Kullanımı - Bot Yazma | Emre Akkaya

C# Html Agility Pack Kullanımı – Bot Yazma

Arkadaşlar herkese merhaba,

Bu yazımızda sizlerle birlikte C# ile Visual Studio da Web sayfalarından istediğimiz tabloları, resimleri, yani kısacası web sayfalarının tüm içeriğini nasıl parse edebiliriz bunun üzerine konuşucağız.

Öncelikle arkadaşlar temel yöntem ve kodları göstermeye çalışıcağım istediğiniz içeriği bu yöntemle deneyerek araştırarak kendinizi geliştirerek çekebilirsiniz unutmayın. Kullanacağımız kütüphane Html Agility Pack kütüphanesidir. Bu kütüphane ile istediğiniz içeriği kolayca çekebilirsiniz.Bir tane örnek proje yapalım ve kütüphanenin nimetlerinden faydalanalım.Hadi Başlayalım.

  • Öncelikle Visual Studio da yeni bir windows form projesi oluşturalım.
  • Ardından aşağıdaki gibi basit bir form tasarımı yapabiliriz.

  • Nuget dan html agility pack kütüphanesini projemize ekleyelim.

  • Artık kodlarımızı yazmaya başlayabiliriz.
  • Butona çift tıklayalım ve butonun click özelliğine aşağıdaki kodları yazalım.
string link = "http://emreakkaya.com.tr/";  //link değişkenine çekeceğimiz web sayafasının linkini yazıyoruz.

            Uri url = new Uri(link); //Uri tipinde değişeken linkimizi veriyoruz.

            WebClient client = new WebClient(); // webclient nesnesini kullanıyoruz bağlanmak için.
            client.Encoding = Encoding.UTF8; //türkçe karakter sorunu yapmaması için encoding utf8 yapıyoruz.

            string html = client.DownloadString(url); // siteye bağlanıp tüm sayfanın html içeriğini çekiyoruz.

            HtmlAgilityPack.HtmlDocument document = new HtmlAgilityPack.HtmlDocument(); //kütüphanemizi kullanıp htmldocument oluşturuyoruz.
            document.LoadHtml(html);//documunt değişkeninin html ine çektiğimiz htmli veriyoruz
  • Yanlarına yorum satırı olarak açıklamalarını yazdım tabi önce using kısmına Html agility pack ve System.Net Kütüphanemizi eklememiz gerekiyor.
  • Burdaki temel mantık arakadaşlar url e göre belirttiğimiz adresin tüm html içeriğini indiriyoruz.
  • Arkadaşlar veriyi kendi sitemizin anasayfasında bulunan kategori bölümünün sadece kategori adlarını çekeceğiz ve text box a yazdıracağız.

  • Kategori divimiz burda içinde bakıyoruz ve ul li etiketleriniz görüyoruz burda text in bulunduğu kısım ise li altındaki a elemnetinin altındaki birinci span etiketi olduğunu görüyoruz.Çünkü ikinci span etiketinin içindeki text blog yazılarının adetini gösteriyor biz sadece kategori adını alacağız. Peki biz sadece istediğimiz alanın içeriğini nasıl çekeceğiz derseniz de burda xPath adresini bulmamız lazım.

  • Ul html ini çekip tüm li etiketlerinin içinde dönücez ve içindeki span etiketinin classı “category-text” olanı alacağız.Çünkü iki spanı birbirinden ayıran tek fark bu. XPath adresi dediğimiz şey ise Html içinde o alanın o etiketin konumu demek yani bize adresini veriyor arkadaşlar.

 

var secilenhtml = @"//*[@id=""categories-3""]/ul"; // veriyi çekeceğimiz div alanı kategori listesi xpath adresi

            StringBuilder st = new StringBuilder(); //veriyi atacağımız stringbuilder

            var secilenHtmlList = document.DocumentNode.SelectNodes(secilenhtml); //selectnodes methoduyla verdiğimiz xpathin htmlini getiriyoruz.

            foreach (secilenHtmlList'teki var öğeler)
            {
                foreach (var innerItem in items.SelectNodes("li"))//her ul un içindeki li de dön
                {
                    foreach (var item in innerItem.SelectNodes("a//span")) // her li nin içindeki a elementinin altındaki spanlarda dön
                    {
                        var classValue = item.Attributes["class"] == null ? null : item.Attributes["class"].Value;//spanların value su null değilse classvalue değişkenine at.Burdaki amaç ikinci classtaki sayı değerini almamak.Sadece kategori adını alma
                        if (classValue == "category-text")//class değeri category-text olanları al
                        {
                            st.AppendLine(item.InnerText); // gelen değeri ekle ve bir altsatıra geç v
                        }

                    }
                }
            }

            txtResults.Text = st.ToString();//textboxa tüm değerleri yaz
  • Burda özellikle değinmek istediğim şey SelectNodes ve Attributes kısmı;
  • SelectNodes kısmında biz xPath adresimizi giriyoruz. Burada önce genel ul kısmının xPath adresinde döndük. Ardından o xPath deki li elementlerinde döndük ve Attributes class ı category-text olanın innertext ile sadece text ini stringbuilder a ekledik.
  • En sonda ise textbox ımıza yazdırdık.

Evet arkadaşlar Html Agility Pack ile veri çekmek ve bunları istediğiniz şekilde dizayn etmek tamamen sizin hayal güzücünüze kalmış, küçük formlar hazırlayarak bu kütüphaneyi kullanma becerinizi geliştirebilirsiniz. Sağlıcakla kalın…

İlginizi çekebilecek bir konu ; https://www.erkeklernedio.com/

Bu içerik hakkında düşünceleriniz nelerdir?

/* ]]> */