¿Cómo obtener elementos y atributos href para cada nodo?

c# href html html-agility-pack

Pregunta

Estoy trabajando en un proyecto que debería leer html, y encontrar encontrar todos los nodos que coincidan con un valor, luego encontrar elementos y atributos de los nodos ubicados. Sin embargo, estoy teniendo dificultades para descubrir cómo obtener los atributos y elementos de href.

Estoy usando HTMLAgilityPack. Tengo numerosos nodos de

clase = "medio"

a lo largo del html. Necesito obtenerlos todos, y de ellos, obtener el elemento href y los atributos. A continuación se muestra una muestra del 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>

He podido obtener los otros atributos que necesito, pero no para 'href'. Aquí está el código que tengo:

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)
}

Sin embargo, mi código anterior me da el primer valor href para toda la página html, y lo hace para cada nodo por algún motivo (visible al enviar la lista a un buzón de mensajes). Pensé que al estar en mi bucle foreach el uso de SelectSingleNode debería obtener el primer atributo href para ese nodo específico. Si es así, ¿por qué obtengo el primer atributo href para toda la página html cargada?

He estado revisando muchos subprocesos aquí sobre cómo obtener valores href con HTLMAgilityPack, pero no he podido hacer que esto funcione.

¿Cómo puedo obtener el atributo href y los elementos para cada nodo que estoy seleccionando en función del atributo de clase (class = "middle")?

Respuesta aceptada

Tratar de reemplazar

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

con

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

Aparte de eso, el código anterior funciona para mí.

Alternativamente:

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


Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow