2017-01-31 1 views
0

J'essaie d'obtenir le innerText d'une classe. Voici mon code:HTMLAgilityPack obtenir class innerText

using (HttpClient clientduplicate = new HttpClient()) 
{ 
    clientduplicate.DefaultRequestHeaders.Add("User-Agent", 
     "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)"); 

    using (HttpResponseMessage responseduplicate = await clientduplicate.GetAsync(@"https://www.investing.com/news/stock-market-news/warren-buffett:-i-bought-$12-billion-of-stock-after-trump-won-456954") 
    using (HttpContent contentduplicate = responseduplicate.Content) 
    { 
     try 
     { 
      string resultduplicate = await contentduplicate.ReadAsStringAsync(); 

      var websiteduplicate = new HtmlDocument(); 
      websiteduplicate.LoadHtml(resultduplicate); 

      var titlesduplicate = websiteduplicate.DocumentNode.Descendants("div").FirstOrDefault(o => o.GetAttributeValue("class", "") == "arial_14 clear WYSIWYG newsPage"); 
      var match = Regex.Match(titlesduplicate.InnerText, @"(.*?)<!--", RegexOptions.Singleline).Groups[1].Value; 

      Debug.WriteLine(match.TrimStart()); 
     } 
     catch(Exception ex1) 
     { 
      var dialog2 = new MessageDialog(ex1.Message); 
      await dialog2.ShowAsync(); 
     } 
    } 
} 

Maintenant, le problème est que cela va aussi me renvoyer le texte sur l'image. Je peux trouver une solution de contournement mais je me demandais s'il y avait une autre approche à ce sujet. Quelque chose de plus simple/plus rapide.

De plus, lorsque je l'utilise sur d'autres articles/URL, il y a d'autres bugs mineurs.

+1

Vous pouvez nettoyer votre nœud avec une requête XPath comme ce 'titlesduplicate.SelectNodes ("./ img") ?. ToList() foreach (i => i.Remove()); 'Et pour sélectionner des titlesduplicate, utilisez' var titlesduplicate = websiteduplicate.DocumentNode.SelectSingleNode ("// div [contient (@class, 'newsPage')]"); ' – Kalten

+0

Pouvez-vous préciser ce que les bugs sont? – GantTheWanderer

+0

@GantTheWanderer encodages alphabétiques, lettres changées en html. Choses mineures. –

Répondre

2

Il y a plusieurs façons de le faire. Une façon est d'enlever le carrousel div avant de innerText. doc.DocumentNode.Descendants("div").FirstOrDefault(_ => _.Id.Equals("imgCarousel"))?.Remove();

+0

Cela lancera 'System.NullReferenceException' si' imgCarousel' n'existe pas. Je l'ai corrigé mais édite ta réponse pour que je puisse l'accepter. –

+0

Je vois. J'ai ajouté '?' Pour vérifier la référence nulle. J'espère que vous connaissez cette syntaxe C# 6 –

+0

Je le fais, merci. –