HTML XPath Buscando por nombre de clase

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

Pregunta

Tengo un problema con xpath en c #
Quiero encontrar todos los elementos con esta estructura.
Tengo 10 enlaces que todos tienen esta estructura:

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

por ejemplo, con esta muestra quiero obtener "Google" y "www.google.com" y "Buscar en el mundo".

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

Pero me sale un error de referencia nula

Respuesta aceptada

El problema está en la consulta donde está obteniendo los titles . Está buscando div, cuyo atributo de class contiene PartialSearchResults-item , que es el nodo raíz de su elemento. Pero también hay otros nodos que satisfacen su consulta, por ejemplo, el div con la clase PartialSearchResults-item-title también satisface su consulta. Luego, después de seleccionar estos 2 divs, está iterando sobre ellos e intentando obtener nodos secundarios de suma, para la primera iteración su código funcionará bien, porque tiene el nodo derecho, pero en la segunda iteración tiene el nodo con la clase PartialSearchResults-item-title que solo tiene una a , por lo que obtendrá NullReferenceException en la segunda iteración cuando esté consultando la descripción, porque está intentando obtener el valor de la propiedad InnerText del objeto null

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

Yo sugeriría que no usar contains . En su caso, su nodo raíz tiene solo una clase PartialSearchResults-item , por lo que puede consultarla así

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


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué