C# : Bir web sitesinin RSS beslemelerini elde etmek

Merhaba arkadaşlar,
Bir web sitesine girdiğimde tarayıcıda görünen rss simgesi hep dikkatimi çekmiştir. Tarayıcının o web sitesindeki rss beslemelerini nasıl tespit ettiğini hep merak ediyordum. Bugün tesadüfen öğrendim <head> </head> tagleri arasına yazılan birtakım kodlar sayesinde tarayıcılar ve arama motorları bu web sitesinin RSS beslemelerinden haberdar oluyorlarmış.

O kod şöyle;

Bunu öğrendikten sonra girilen url’nin beslemelerini döndüren basit bir uygulama yazdım, bugün onu paylaşacağım.

Öncelikle Nuget’ten HtmlAgilityPack’i projeye dahil etmek gerekiyor. HtmlAgilityPack, html kodlarındaki elementlere Regex ile uğraşmadan erişebileceğiniz kullanışlı bir paket.

  public class Feed
{
public string url { get; set; }
public string title { get; set; }
}

Önce Feed adında bir sınıf yazdım, bu sınfın title ve url adında iki adet property’si var.

   static bool ParseUrl(string url)
{
if (string.IsNullOrEmpty(url))
return false;

if (Regex.IsMatch(url, "^http://", RegexOptions.IgnoreCase))
return true;

return false;
}

ParseUrl metodu girilen url’nin geçerli bir url olup olmadığını kontrol eden, geriye true veya false döndüren bir metot.
Basitçe girilen url boşsa false, http:// ile başlıyorsa true döndürüyor.

  static IEnumerable<Feed> findFeed(string url)
{
HtmlWeb hw = new HtmlWeb();
HtmlDocument doc = hw.Load(url);

var nodes = doc.DocumentNode.SelectNodes("//link[(@type='application/rss+xml' or @type='application/atom+xml') and @rel='alternate']");

var query = from feed in nodes
select new Feed
{
title = feed.Attributes["title"].Value,
url = feed.Attributes["href"].Value
};
return query;
}

Yukarıdaki findFeed metodu ise kendisine parametre olarak gelen url’deki web sitesini htmldocument olarak kaydediyor. nodes tanımamasında ise bu htmldocument içerisindeki yazının başında belirttiğim şablona uyan elementleri HtmlNodeCollection olarak döndürüyor. Son bölümde ise bu koleksiyondan LINQ ile Feed sınıfına ait nesneler üretiyoruz. ve döndürüyoruz.

Ve main metodu:

 static void Main(string[] args)
{
IEnumerable<Feed> feeds;

Console.Write("Url girin: ");
string url = Console.ReadLine();

if (ParseUrl(url))
feeds = findFeed(url);
else
{
Console.WriteLine("Hatalı url girdiniz.");
return;
}


Console.WriteLine("\n" + url + " adresindeki bulunan beslemeler:\n");
foreach (Feed f in feeds)
{
Console.Write("Başlık: {0} URL:{1} \n", f.title, f.url);
}
Console.ReadLine();
}

Kullanıcıdan url isteniyor, url geçerliyse findFeed metodu ile beslemeler bulunup listeleniyor.

Programın çıktısı da şöyle:

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir