HTML XPath Ricerca per nome della classe

asp.net c# html html-agility-pack xpath

Domanda

Ho un problema con xpath in c #
Voglio trovare tutti gli elementi con questa struttura
Ho 10 collegamenti che hanno tutti questa struttura:

<div class="PartialSearchResults-item" data-zen="true">
<div class="PartialSearchResults-item-title">
<a class="PartialSearchResults-item-title-link result-link"target="_blank" href='https://www.google.com/'> Google</a>
    </div>
<p class="PartialSearchResults-item-url">www.google.com</p>
<p class="PartialSearchResults-item-abstract">Search the world.</p>
   </div>

per esempio con questo esempio voglio ottenere "Google" e "www.google.com" e "Cerca nel mondo".

var titles = hd.DocumentNode.SelectNodes("//div[contains(@class, 'PartialSearchResults-item')]");
string link;
foreach (HtmlNode node in titles){
string description = node.SelectSingleNode(".//*[contains(@class,'PartialSearchResults-item-abstract')]").InnerText;

link = node.SelectSingleNode(".//*[contains(@class,'PartialSearchResults-item-url')]").InnerText;

 string title = node.SelectSingleNode(".//a[contains(@class,'PartialSearchResults-item-title-link result-link')]").InnerText;}

Ma ottengo riferimento errore nullo

Risposta accettata

Il problema è nella query in cui stai ricevendo i titles . Stai cercando l'attributo div che's class contiene PartialSearchResults-item , che è il nodo root del tuo oggetto. Ma ci sono anche altri nodi che soddisfano la tua richiesta, per esempio il div con la classe PartialSearchResults-item-title soddisfa anche la tua richiesta. Quindi dopo aver selezionato questo 2 div si sta iterando su di loro e cercando di ottenere la somma di nodi figlio, per la prima iterazione il tuo codice funzionerà bene, perché hai il nodo giusto, ma nella seconda iterazione hai il nodo con la classe PartialSearchResults-item-title che ha solo un a , quindi otterrete NullReferenceException nella seconda iterazione quando si esegue una query per la descrizione, perché si sta tentando di ottenere il valore della proprietà InnerText dell'oggetto null

string description = node.SelectSingleNode(".//*[contains(@class,'PartialSearchResults-item-abstract')]").InnerText;

Suggerirei di non usare contains . Nel tuo caso il tuo root node ha solo una classe PartialSearchResults-item , quindi puoi interrogarla in questo modo

var titles = hd.DocumentNode.SelectNodes("//div[@class='PartialSearchResults-item']");


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é