41 votes

HtmlAgilityPack ne sélectionne pas les childNodes comme prévu

J'essaie d'utiliser la bibliothèque HtmlAgilityPack pour analyser certains liens dans une page, mais je ne vois pas les résultats que j'attendrais des méthodes. Dans ce qui suit, j'ai une HtmlNodeCollection de liens. Pour chaque lien, je veux vérifier s'il y a un nœud d'image et ensuite analyser ses attributs, mais les méthodes SelectNodes et SelectSingleNode de linkNode semblent chercher dans le document parent et non dans les childNodes de linkNode, qu'est-ce qui se passe ?

HtmlDocument htmldoc = new HtmlDocument();
htmldoc.LoadHtml(content);
HtmlNodeCollection linkNodes = htmldoc.DocumentNode.SelectNodes("//a[@href]");

foreach(HtmlNode linkNode in linkNodes)
{
    string linkTitle = linkNode.GetAttributeValue("title", string.Empty);
    if (linkTitle == string.Empty)
    {
        HtmlNode imageNode = linkNode.SelectSingleNode("/img[@alt]");     
    }
}

Y a-t-il un autre moyen d'obtenir l'attribut alt de l'image childnode du linkNode s'il existe ?

44voto

Richard Szalay Points 42486

Vous devez supprimer le préfixe forwardslash de "/img[@alt]" car il signifie que vous voulez commencer à la racine du document.

HtmlNode imageNode = linkNode.SelectSingleNode("img[@alt]");

43voto

ulty4life Points 1842

Avec une requête xpath, vous pouvez également utiliser "." pour indiquer que la recherche doit commencer au nœud actuel.

HtmlNode imageNode = linkNode.SelectSingleNode(".//img[@alt]");

10voto

msqr Points 218

Aussi, faites attention à Null Check. SelectNodes renvoie null au lieu d'une collection vide.

HtmlNodeCollection linkNodes = htmldoc.DocumentNode.SelectNodes("//a[@href]");

**if(linkNodes!=null)**
{
   foreach(HtmlNode linkNode in linkNodes)
  {
     string linkTitle = linkNode.GetAttributeValue("title", string.Empty);
     if (linkTitle == string.Empty)
     {
       **HtmlNode imageNode = linkNode.SelectSingleNode("img[@alt]");**   
     }
  }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X