Come ottenere elementi href e attributi per ogni nodo?

c# href html html-agility-pack

Domanda

Sto lavorando a un progetto che dovrebbe leggere html e trovare trovare tutti i nodi che corrispondono a un valore, quindi trovare elementi e attributi dei nodi individuati. Sto avendo difficoltà a capire come ottenere gli attributi e gli elementi href.

Sto usando HTMLAgilityPack. Ho numerosi nodi di

class = "middle"

attraverso l'html. Ho bisogno di prenderli tutti e, da loro, ottenere l'elemento href e gli attributi. Di seguito è riportato un esempio di 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>

Sono stato in grado di ottenere gli altri attributi di cui ho bisogno, ma non per 'href'. Ecco il codice che ho:

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

Il mio codice sopra però mi sta dando il primo valore href per l'intera pagina html, e per qualche motivo lo sto dando per ogni nodo (visibile emettendo l'elenco in una messagebox). Ho pensato di trovarmi nel mio ciclo di foreach che usando SelectSingleNode dovresti ottenere il primo attributo href per quel nodo specifico. In tal caso, perché sto ottenendo il primo attributo href per l'intera pagina html caricata?

Ho esaminato molte discussioni su come ottenere i valori href con HTLMAgilityPack, ma non sono riuscito a farlo funzionare.

Come posso ottenere l'attributo href e gli elementi per ciascun nodo che sto selezionando in base all'attributo class (class = "middle")?

Risposta accettata

Prova a sostituire

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

con

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

Oltre a questo, il codice sopra funziona per me.

In alternativa:

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


Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow