Seleziona tutti i link da una tabella Html usando XPath (e HtmlAgilityPack)

c# html-agility-pack xpath

Domanda

Quello che sto cercando di ottenere è quello di estrarre tutti i collegamenti con un attributo href che inizia con http: //, https: // o /. Questi collegamenti si trovano all'interno di una tabella (tbody> tr> td etc) con una certa classe. Pensavo di poter specificare solo un elemento senza il percorso completo ma non sembra funzionare. Ottengo una NullReferenceException sulla linea che seleziona i collegamenti:

var table = doc.DocumentNode.SelectSingleNode("//table[@class='containerTable']");
if (table != null)
{
    foreach (HtmlNode item in table.SelectNodes("a[starts-with(@href, 'https://')]"))
    {
        //not working

Non conosco alcun consiglio o best practice per quanto riguarda XPath. Creo un sovraccarico quando interrogo il documento due volte?

Risposta accettata

Usa :

 //tbody/descendant::a[starts-with(@href,'https://')
                     or
                       starts-with(@href,'http://')
                     or
                       starts-with(@href,'./') 
                      ]

Avrai ancora un problema , a meno che tu non corregga il tuo codice per riflettere il fatto che il metodo di istanza XmlNode.SelectNodes() ha un tipo restituito di XmlNodeList , non HtmlNode .


Risposta popolare

Il problema è che state selezionando la tabella e provate immediatamente a selezionare le ancore come se fossero decedenti diretti. Ci sono tag tr e td nel mezzo.

Quindi, se cambi il tuo xpath nel modo seguente, le cose dovrebbero funzionare:

"tbody/tr/td/a[starts-with(@href, 'https://')]"

Questo non funzionerà se i tuoi ancore sono racchiusi in qualcos'altro, quindi puoi selezionare tutti gli ancore nel set corrente di nodi (es. Tabella):

"tbody/tr/td/a[starts-with(@href, 'https://')]"

Vedi questo per maggiori dettagli sulla sintassi xpath.




Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché