Soru :
Merhaba arkadaşlar ben web sitesinden bi veri çekmek istiyorum ama internette aradım sürekli <title> içindeki yazıyı çekiyorlar. Bazılarını anlamadım o yüzden bana yardımcı olursanız çok sevinirim. Ben siteden title değilde burdaki html kodundaki
1 2 3 4 5 6 7 8 9 10 11 12 | <p id="contract"> <b>Geliştime masrafları </b> seviye 3:<br> <img class="r1" src="assets/x.gif" alt="Odun" title="Odun">225 | <img class="r2" src="assets/x.gif" alt="Tuğla" title="Tuğla">110 | <img class="r3" src="assets/x.gif" alt="Demir" title="Demir">225 | <img class="r4" src="assets/x.gif" alt="Tahıl­" title="Tahıl­">140 | <img class="r5" src="assets/x.gif" alt="Tahıl Tüketimi" title="Tahıl Tüketimi">1 | <img class="clock" src="assets/x.gif" alt="Dönem" title="Dönem">0:00:00<br> <a class="build" href="village1.php?id=5&k=48bdc">seviye atlat 3</a> </p> |
Cevap :
C# ile HTML belgesi içindeki koddan bir etiketin içeriğini almak / HTML’yi çözümlemek için en çok tercih edilen yöntem HtmlAgilityPack isimli bir kütüphaneyi kullanmaktır.
Bu kütüphanede HTML belgesini yükleyip, XPath ile etiket veya etiketlere ulaşıp içeriğini alabilirsiniz.
HtmlAgilityPack ‘i Nuget ile de indirebilirsiniz.
İçinde sizin sorunuzda belirttiğiniz HTML kodu bulunan bir HTML belgesi için şöyle bir örnek verebiliriz:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | void cozumle(string adres) { // Bir WebClient ile sayfanın tamamını string olarak al. WebClient client = new WebClient(); string htmlString = client.DownloadString(adres); // htmlBelgesiument nesnesi oluştur. HtmlAgilityPack.HtmlDocument htmlBelgesi = new HtmlAgilityPack.HtmlDocument(); // Etiket kapatma hatalarını düzeltsin. htmlBelgesi.OptionFixNestedTags = true; // Belgeyi çözümle htmlBelgesi.LoadHtml(htmlString); // id özellik değeri contract olan etiketin içindeki 6. img etiketinden sonra gelen ilk // metin düğümünü bul ve secilenler isimli koleksiyona ata. HtmlAgilityPack.HtmlNodeCollection secilenler = htmlBelgesi.DocumentNode.SelectNodes("(/p[@id='contract']//img)[6]/following-sibling::text()"); if (secilenler != null) // Etiket bulabildiyse ... (Şarta uyan etiket bulunamadıysa null döndürüyor.) { // Aranan secilenler'in ilk elemanıdır. Bunun InnerText özellik değerini label1'in // Text özelliğine ata. label1.Text = secilenler[0].InnerText; } } |