Je ne parviens pas à comprendre comment traverser le DOM avec HTML Agility Pack.
Par exemple, disons que je voulais trouver un élément avec id="gbqfsa"
.
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(Url);
var foo = from bar in doc.DocumentNode.DescendantNodes()
where bar.Attributes["id"].Value == "gbqfsa"
select bar.InnerText;
En ce moment, je fais cela (ci-dessus), mais foo
est null
. Qu'est-ce que je fais mal?
EDIT: Ceci est la déclaration if
j'utilisais. InnerText
juste de voir si les éléments InnerText
étaient InnerText
"Recherche Google"
if (foo.Equals("Google Search"))
{
HasSucceeded = 1;
MessageBox.Show(yay);
}
else
{
MessageBox.Show("kms");
}
return HasSucceeded;
Ce que vous devriez faire est:
var foo = (from bar in doc.DocumentNode.DescendantNodes()
where bar.GetAttributeValue("id", null) == "gbqfsa"
select bar.InnerText).FirstOrDefault();
Vous avez oublié FirstOrDefault()
pour sélectionner le premier élément FirstOrDefault()
à la condition where
.
Et je remplace Attributes["id"].Value
par GetAttributeValue("id", null)
pour ne pas GetAttributeValue("id", null)
une exception si un élément possède un attribut id
.
Je ne pense pas que foo
semble null
. Plus probablement, bar.Attributes["id"]
est nul pour certains des éléments de l’arborescence, car tous les nœuds descendants n’ont pas de propriété "id". Je recommanderais d'utiliser la méthode GetAttributeValue
, qui renverra une valeur par défaut si l'attribut n'est pas trouvé.
var foo = from bar in doc.DocumentNode.DescendantNodes()
where bar.GetAttributeValue("id", null) == "gbqfsa"
select bar.InnerText;