Problème HTML Agility Pack

c# html-agility-pack

Question

J'essaie d'extraire tout ce qui réside dans une div avec un certain nom de classe / id. J'utilise le code suivant:

var webGet = new HtmlWeb();
var document = webGet.Load("http://www.4guysfromrolla.com/articles/011211-1.aspx");

var partOfWebpage = from completeWebpage in document.DocumentNode.Descendants("div")
                             where
                                 completeWebpage.Attributes["class"].Value == "content" &&
                                 completeWebpage.Attributes["class"].Value != null
                             select completeWebpage.InnerHtml;

foreach (var s in partOfWebpage)
{
    textBox1.AppendText(s);
}

Je reçois une erreur "NullReferenceException was Unhandled - La référence à un objet n'est pas définie sur une instance d'objet" .

Apparemment, il ne trouve pas la div du tout. Lorsque je mets "table" au lieu de "div" dans la méthode Descendants (), tout fonctionne correctement et je suis en mesure de choisir une table de mon choix avec la définition de classe / id.

Qu'est-ce que je fais mal?


Réponse acceptée

Essayez de vérifier si l'attribut existe avant de le déréférencer:

from completeHomepage in document.DocumentNode.Descendants("div")
where completeHomepage.Attributes["class"] != null &&
      completeHomepage.Attributes["class"].Value == "content" &&
      completeHomepage.Attributes["class"].Value != null
select completeHomepage.InnerHtml;

Réponse populaire

Vous pouvez utiliser XPath pour sélectionner la div par classe (ou par ID si vous en avez besoin).

var results = document.DocumentNode.SelectNodes("//div[@class='content']");



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi