Comment obtenir des éléments et des attributs href pour chaque noeud?

c# href html html-agility-pack

Question

Je travaille sur un projet qui doit lire le code HTML, trouver tous les nœuds qui correspondent à une valeur, puis rechercher les éléments et attributs des nœuds localisés. J'ai du mal à comprendre comment obtenir les attributs et les éléments href.

J'utilise HTMLAgilityPack. J'ai de nombreux nœuds de

classe = "milieu"

tout au long du html. Je dois les obtenir tous et obtenir d'eux l'élément href et ses attributs. Vous trouverez ci-dessous un exemple du code HTML:

<div class="top">
        <div class="left">            
                <a href="item123">
                    <img src="url.png" border="0" />
                                    </a>
            </div>
        </div>
<div class="middle">
            <div class="title"><a href="item123">Captains Hat</a></div>

                            <div class="day">monday</div>

            <div class="city">Tuscon, AZ | 100 Days | <script typs="text/javascript">document.write(ts_to_age_min(1445620427));</script></div>

</div>

J'ai pu obtenir les autres attributs dont j'ai besoin, mais pas pour "href". Voici le code que j'ai:

List<string> listResults = new List<string>();         
var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(url);                      

//get each listing                       
foreach (HtmlNode node in doc.DocumentNode.Descendants("div").Where(d =>
                d.Attributes.Contains("class") && d.Attributes["class"].Value.Contains("middle")))
            {                
string day = node.SelectSingleNode(".//*[contains(@class,'day')]").InnerHtml; 
string city = node.SelectSingleNode(".//*[contains(@class,'city')]").InnerHtml;
string item = node.SelectSingleNode("//a").Attributes["href"].Value;

listResults.Add(day + EnvironmentNewline 
+ city + EnvironmentNewline 
+ item + EnvironmentNewline + EnvironmentNewline)
}

Mon code ci-dessus me donne cependant la première valeur href pour la page entière HTML, et le donne pour chaque nœud pour une raison quelconque (visible en affichant la liste dans une boîte à messages). Je pensais être dans ma boucle foreach qu'en utilisant SelectSingleNode, on devrait obtenir le premier attribut href pour ce nœud spécifique. Si tel est le cas, pourquoi le premier attribut href de toute la page html est-il chargé?

J'ai beaucoup parlé de l'obtention de valeurs href avec HTLMAgilityPack, mais je n'ai pas réussi à faire en sorte que cela fonctionne.

Comment obtenir l'attribut href et les éléments de chaque nœud que je sélectionne en fonction de l'attribut class (class = "middle")?

Réponse acceptée

Essayez de remplacer

 string item = node.SelectSingleNode("//a").Attributes["href"].Value;

avec

 string item = node.SelectSingleNode(".//a").Attributes["href"].Value;

Autre que cela, le code ci-dessus fonctionne pour moi.

Alternativement:

string item = node.SelectSingleNode(".//*[contains(@class,'title')]")
              .Descendants("a").FirstOrDefault().Attributes["href"].Value; 



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