2009-05-13 5 views
35

Je tente 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 un HtmlNodeCollection de liens. Pour chaque lien, je veux vérifier s'il y a un nœud d'image, puis analyser ses attributions, mais les méthodes SelectNodes et SelectSingleNode de linkNode semblent rechercher le document parent et non les childNodes de linkNode ce qui donne?HtmlAgilityPack sélectionnant childNodes pas comme prévu

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]");  
    } 
} 

est-il une autre façon que je pourrais obtenir l'attribut alt de la childNode image de linkNode si elle existe?

Répondre

37

Vous devez supprimer le préfixe avant-ligne de "/ img [@alt]" car cela signifie que vous voulez démarrer à la racine du document.

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

Errrm OK. C'était assez stupide de ma part. Je pensais qu'il me manquait quelque chose. Désolé de gaspiller l'espace de question Merci. – Sheff

+3

Il y a toujours beaucoup d'espace :) –

+1

Vous l'homme! Il y a une seconde je maudissais sur le projet HtmlAgility, mais il s'avère qu'ils ont juste implémenté xpath dans le bon sens :) – Moulde

10

De même, faites attention aux vérifications nulles. SelectNodes renvoie null au lieu de 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]");** 
    } 
    } 
} 
+4

Ce qui était une décision de conception vraiment stupide IMO. Il n'y a aucune raison pour que * ne retourne pas une collection vide. – mpen

+0

voir aussi http://stackoverflow.com/questions/8619724/htmlagilitypack-documentnode-selectnodes-returns-null-shouldnt –

38

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

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

L'axe par défaut est 'children' à un préfixe n'est en fait pas du tout nécessaire. –

+1

Ceci devrait être la réponse acceptée. –

Questions connexes