C# htmlagilitypack strong gelmesini nasıl iptal edilir?

AhmetBirkan

Hectopat
Katılım
24 Temmuz 2020
Mesajlar
782
Çözümler
2
Merhaba, sorunum şu ben html dosyamın içindeki veriyi alıp listeye aktarıyorum. Şimdi sorun şu ol etiketi içindeki li etiketinin içindeki p etiketinin içinde 2 farklı kelime var. Biri strong etiketi içerisinde yazıyor bu ingilizce kelime biri ise direk yazılı yani ekstra strong etiketi kullanılmıyor. Ben HtmlAgilityPack ile strong etiketi içindeki kelimeyi aldım fakat strong olmayan kelimeyi alınca strong etiketi içindeki ingilizce kelimede geliyor. Ben nasıl strong'un gelmesini iptal ederim?

1611919949689.png

Bakın üstte resimde sol tarafta "accountant" yazıyor bunu alırken sorun yok fakat sağ tarafaki "muhasebeci" kelimesini alırken "accountant" kelimeside geliyor. Bunları nasıl ayırırım?

accountant'ı aldığım kod:
C#:
List<string> englishKeywords = new List<string>();

            HtmlAgilityPack.HtmlWeb htmlWeb = new HtmlAgilityPack.HtmlWeb();
            HtmlAgilityPack.HtmlDocument htmlDocument = htmlWeb.Load(@"dosyaKonumu");
            foreach (HtmlAgilityPack.HtmlNode selectNode in htmlDocument.DocumentNode.SelectNodes("//ol//li//p//strong"))
            {
                englishKeywords.Add(selectNode.InnerText.ToString());
            }

            return englishKeywords;

Üstte verdiğim c# kodunun aynısını strong olmayan kelimeyi almak içinde kullanıyorum şu şekilde: //ol//li//p fakat strong'u dahil ediyor. Benim strong'u devre dışı bırakmam gerek nasıl yaparım?

[CODE lang="html" title="HTML dosyamın içeriği"]
<ol><li><p><strong>accountant:</strong> muhasebeci</p></li>
<li><p><strong>afraid:</strong> korkmuş</p></li>
<li><p><strong>age:</strong> yaş</p></li>
<li><p><strong>airplane:</strong> uçak</p></li>
<li><p><strong>alone:</strong> yalnız</p></li>
<li><p><strong>angry:</strong> kızgın</p></li>
<li><p><strong>animal:</strong> hayvan</p></li>
<li><p><strong>answer:</strong> cevap, cevap vermek</p></li>
[/CODE]

@Bedirhan SAMSA @Linuxginar @The Anorak Hocalarım bakarsanız sevinirim :).
 
Merhaba, sorunum şu ben html dosyamın içindeki veriyi alıp listeye aktarıyorum. Şimdi sorun şu ol etiketi içindeki li etiketinin içindeki p etiketinin içinde 2 farklı kelime var. Biri strong etiketi içerisinde yazıyor bu ingilizce kelime biri ise direk yazılı yani ekstra strong etiketi kullanılmıyor. Ben HtmlAgilityPack ile strong etiketi içindeki kelimeyi aldım fakat strong olmayan kelimeyi alınca strong etiketi içindeki ingilizce kelimede geliyor. Ben nasıl strong'un gelmesini iptal ederim?

Eki Görüntüle 857229
Bakın üstte resimde sol tarafta "accountant" yazıyor bunu alırken sorun yok fakat sağ tarafaki "muhasebeci" kelimesini alırken "accountant" kelimeside geliyor. Bunları nasıl ayırırım?

accountant'ı aldığım kod:
C#:
List<string> englishKeywords = new List<string>();

            HtmlAgilityPack.HtmlWeb htmlWeb = new HtmlAgilityPack.HtmlWeb();
            HtmlAgilityPack.HtmlDocument htmlDocument = htmlWeb.Load(@"dosyaKonumu");
            foreach (HtmlAgilityPack.HtmlNode selectNode in htmlDocument.DocumentNode.SelectNodes("//ol//li//p//strong"))
            {
                englishKeywords.Add(selectNode.InnerText.ToString());
            }

            return englishKeywords;

Üstte verdiğim c# kodunun aynısını strong olmayan kelimeyi almak içinde kullanıyorum şu şekilde: //ol//li//p fakat strong'u dahil ediyor. Benim strong'u devre dışı bırakmam gerek nasıl yaparım?

[CODE lang="html" title="HTML dosyamın içeriği"]
<ol><li><p><strong>accountant:</strong> muhasebeci</p></li>
<li><p><strong>afraid:</strong> korkmuş</p></li>
<li><p><strong>age:</strong> yaş</p></li>
<li><p><strong>airplane:</strong> uçak</p></li>
<li><p><strong>alone:</strong> yalnız</p></li>
<li><p><strong>angry:</strong> kızgın</p></li>
<li><p><strong>animal:</strong> hayvan</p></li>
<li><p><strong>answer:</strong> cevap, cevap vermek</p></li>
[/CODE]

@Bedirhan SAMSA @Linuxginar @The Anorak Hocalarım bakarsanız sevinirim :).
Hocam pek anlamadım ama C# içinden o kelimeleri iki noktadan ayırıp kullanabilirsiniz. Python'daki strip gibi.
Ayrıca foreach döngüsü sanırım iki kelimeyi de alıyor.
 
Hocam pek anlamadım ama C# içinden o kelimeleri iki noktadan ayırıp kullanabilirsiniz. Python'daki strip gibi.
Ayrıca foreach döngüsü sanırım iki kelimeyi de alıyor.
Evet ayırmak aklıma geldi fakat ileride htmlagilitypack bir daha lazım olursa cevabını bilmek istedim. Agilitypack'e // ile dizin söylüyoruz dizini iptal etmek yok mu acaba? Syntax'a baktım ama bulamadım.
 
Evet ayırmak aklıma geldi fakat ileride htmlagilitypack bir daha lazım olursa cevabını bilmek istedim. Agilitypack'e // ile dizin söylüyoruz dizini iptal etmek yok mu acaba? Syntax'a baktım ama bulamadım.
Hocam doğrusu daha önce hiç htmlagilitypack ile çalışmadım. Ama bir yolu olmalı mutlaka.
 
Anladım kadarıyla;

//ol//li//p//strong ile sadece strong tagı arasındaki kelime geliyor.
//ol//li//p ile strong'un dışında kalan kısmını da istiyorsunuz.


<strong>afraid:</strong> korkmuş sadece "korkmuş" ifadesi çekilmek isteniyorsa. Regex veya String.Replace kullanılabilir. HTMLAgility kullanmadığım için strong içerisindeki ifadeden kastınız <strong>afraid:</strong> korkmuş ise farklı bir çözüm afraid korkmuş olarak dönüyorsa farklı çözüm uygulamanız gerekiyor.
 
Anladım kadarıyla;

//ol//li//p//strong ile sadece strong tagı arasındaki kelime geliyor.
//ol//li//p ile strong'un dışında kalan kısmını da istiyorsunuz.
Hocam doğru anlamışsınız. Ben strong'un dışındaki alanı almak istiyorum ama alamadım maalesef. Split ile çektiğim veriyi bölüp dictionary'e atıp işledim. Teşekkür ediyorum ama yardımlarınız için.
 
p içindeki strong elementini remove ederseniz direkt istediğiniz kısım kalır. Mantık olarak li'lerde dönün li'nin içindeki p'nin ilk childını silin.

Edit: C# Online Compiler | .NET Fiddle üzerinden hızlıca yazdım siz daha da temize çekebilirsiniz.

C#:
using System;
using System.Linq;
                    
public class Program
{
    public static void Main()
    {
        var doc = new HtmlAgilityPack.HtmlDocument();
        doc.LoadHtml("<ul><li><p><strong>accountant:</strong> muhasebeci</p></li> <li><p><strong>afraid:</strong> korkmuş</p></li> <li><p><strong>age:</strong> yaş</p></li> <li><p><strong>airplane:</strong> uçak</p></li> <li><p><strong>alone:</strong> yalnız</p></li> <li><p><strong>angry:</strong> kızgın</p></li> <li><p><strong>animal:</strong> hayvan</p></li> <li><p><strong>answer:</strong> cevap, cevap vermek</p></li></ul>");
    
        var nodes = doc.DocumentNode.Descendants();
        var list = nodes.FirstOrDefault();
        foreach (var nodeItem in list.ChildNodes){
            var pElement = nodeItem.ChildNodes.FirstOrDefault();
            if(pElement!=null){
                pElement.ChildNodes.FirstOrDefault().Remove();
                Console.WriteLine(nodeItem.InnerText);
            }
            
        }
    }
}
 
Son düzenleme:
Uyarı! Bu konu 5 yıl önce açıldı.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.

Technopat Haberler

Yeni konular

Geri
Yukarı