C# ile Html Parse İşlemi
Merhabalar, bu gün geliştirdiğimiz proje doğrultusunda ihtiyacımız olabilecek bir konudan söz edeceğim. HTML Parse (Html Parçalama), kullanım amacı bir web sayfası üzerinden veri okuma işlemini yapmak ve bize geri değer döndürmektir. İnternet üzerinde çoğunlukla bot yapım işlemlerinde de kullanılır.
Bunun için bir kaç kütüphaneye ihtiyacımız olacak. Öncelikle NuGet Paket yöneticisinden HtmlAgilityPack‘i yüklenemeniz gerekiyor.
using System.Net; using HtmlAgilityPack; // using'lerini eklemeniz gerekiyor. // Daha sonra kullanacağımız button'un click eventine using (WebClient client = new WebClient()) // Html'i indirmek için bir İstemci Oluşturuyoruz. { var uri = new Uri(link); // link yazan alana verisini okumak istediğimiz web sayfasının bağlantısını yazıyoruz. var host = uri.Host; // bu kısım verdiğimiz linkin Base Url (Merkez Bağlantısı Örn: "https://www.fatihbas.net/2019/04/19/cpu-sicakligi/" adresinden bize sadece "www.fatihbas.net" i döndürüyor)'ni döndürüyor. var scheme = uri.Scheme; // bu kısım ise girmiş olduğumuz linkin "HTTP" veya "HTTPS" olup olmadığını döndürüyor. client.Encoding = Encoding.UTF8; // sayfa kodlama karakter ailesinin UTF-8 olduğunu belirtiyoruz (%90 web sayfaları UTF-8 Olarak kodlanmaktadır) string html = client.DownloadString(link); // bu satırda ise web sayfasının içeriğini indiriyoruz. // Bir HtmlDocument Oluşturarak indirmiş olduğumuz HTML ifadesini içerisine yüklüyoruz. HtmlAgilityPack.HtmlDocument htmlDocument = new HtmlAgilityPack.HtmlDocument(); htmlDocument.LoadHtml(html); // artık parse işlemine geçebiliriz HtmlNodeCollection htmlNodes = htmlDocument.DocumentNode.SelectNodes("//div[@class='wd-single-post no-thumb']"); // burada dikkat edilmesi gereken bir konu, ben birden fazla elemanı döndürmek istediğim için class'ı kullandım. gelen ifade düz metin olduğu için jQuery gibi gelişmiş değil dolayısı ile elementin sahip olduğu class'ı olduğu gibi veriyorum. Burada www.fatihbas.net i baz alarak size örneklendirmeye devam edeceğim if(htmlNodes != null) { //bu alanda istediğimiz sonuçları okumaya yakın olduğumuzu görüyoruz. foreach (HtmlNode node in htmlNodes) { // son olarak gelen elemanları sırası ile burada okuyacağız. HtmlAgilityPack.HtmlDocument _subDocument = new HtmlAgilityPack.HtmlDocument(); _subDocument.LoadHtml(node.InnerHtml); // Gelen nesnemizin alt elemanlarını okurken sorun yaşamamız için yeni bir HtmlDocument oluşturuyoruz. // Ve artık istediğimiz dataları okuyabiliriz. HtmlNode linkNode = _subDocument.DocumentNode.SelectSingleNode("//a[@class='more-link']"); // linkNode Değişkeninde sayfamda bulunan "Devamını Oku (Read More)" butonunu getirmiş oldum. string devaminiOkuLink = linkNode.Attributes["href"].Value; // Devamını Oku butonunun içerisinde ki bağlantıyı almış oldum. HtmlNode icerikNode = _subDocument.DocumentNode.SelectSingleNode("//div[@class='wd-excerpt-content']"); string icerik = icerikNode.InnerHtml; // iceriklerimi HTML Olarak alıyorum. Yanlış Hatırlamıyorsam .InnerHtml yerine ".InnerText" yazarak direkt olarak HTML etiketleri (tag) olmadan salt metni alabilirsiniz. } } }
Html Parse işlemi aslında bu kadar kısa sürüyor, geri kalan işlemler sizin yaratıcılığınıza ve yapmak istediklerinize kalmış.
İyi günler.
Bir yanıt yazın