19 Nisan 2016 Salı

c# htmlagilitypack

Temposu yüksek bir öğrenim dönemini geride bırakmışken dönem boyunca üzerinde çalıştığım projede kullandığım ve oldukça yararını gördüğüm yapıları paylaşmanın tam zamanı.
Geliştirdiğim projenin hazırlık aşamasında yüklü bir miktarda veriyi ilişkili internet sitelerinden toplamam gerekiyordu. İlk iş olarak bu işlemi nasıl gerçekleştirebileceğimin araştırmasına başlamak oldu. Karşıma bu konuda ilk çıkan yöntem Regex(Regular Expression) kullanımı oldu. Yüzeysel olarak anlatmak gerekirse Regex, veri toplayacağınız sitenin HTML kaynak kodu üzerinde sizin oluşturduğunuz regular expression stringlerini arayarak bulunması string ile eşleşen alandaki veriye erişmenize imkan tanıyor. Fakat, Regex stringlerini tanımlamak zaman alıyor. Her farklı işlem için ayrı bir Regex string oluşturmak gerekiyordu.
Araştırmaya devam ederken HTML Agility Pack kütüphanesi ile karşılaştım. HTML Agility Pack kütüphanesinin temel mantığı  HTTP protokolünü ve HTML dilini kullanan sistemlere .NET yapısının  sunmuş olduğu ilgili sınıflar aracılığı ile bağlantı kurup, verileri toplamak ve düzenleyip istediğimiz biçimdeki bilgilere dönüştürmektir.
HTML Agility Pack kütüphanesine http://htmlagilitypack.codeplex.com/adresinden ulaşabilirsiniz.
Küçük ve basit bir konsol uygulaması ile HTML Agility Pack kütüphanesinin kullanımını görelim. Bu uygulamada bloğum içerisinndeki postları çekerek txt dosyasına kaydedebileceğimizi göreceğiz.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using HtmlAgilityPack; 
using System.Web;
using System.Net;
using System.Collections;
using System.Data;
using System.Text.RegularExpressions;
namespace HTMLAgilityTest
{
class Program
{
static void Main(string[] args)
{
icerikAl();
}
static void icerikAl()
{
int sayac = 1;
string adres = "https://muratengun.wordpress.com"; //Veri çekeceğimiz adres
string response = HtmlSayfasıAl(adres);
StreamWriter sr = new StreamWriter("içerik.txt", true, Encoding.GetEncoding("UTF-8")); //Türkçe karakterler için encoding
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(response);
//Ihtiyacımız olan veri <div class="content"> tagi arasinda foreach dongusu ile tüm <div class="content"> taglerini dolaşıp içerisindeki texti alıyoruz
foreach (HtmlNode icerik in doc.DocumentNode.SelectNodes("//div[@class='content']"))
{
sr.WriteLine("İcerik " + sayac + " " + icerik.InnerText + "\n");
Console.WriteLine("İcerik "+sayac+" "+ icerik.InnerText+"\n");
}
}
//Bu method ile veri çekeceğimiz adresin HTML kaynak kodunu bir string içerisinde tutuyoruz.
static string HtmlSayfasıAl(string strURL)
{
String strResult;
WebResponse objResponse;
WebRequest objRequest = HttpWebRequest.Create(strURL);
objResponse = objRequest.GetResponse();
using (StreamReader sr = new StreamReader(objResponse.GetResponseStream(), Encoding.GetEncoding("UTF-8"))) 
{
strResult = sr.ReadToEnd();
sr.Close();
}
return strResult;
}
}