obteniendo valor de rango desde el documento html

.net c# html-agility-pack

Pregunta

He seguido la ruta xpath buscada con el plugin de firefox xpath

id('some_id')/x:ul/x:li[4]/x:span

usando el paquete de agilidad html puedo recuperar id('some_id')/x:ul/x:li[4]

htmlDoc.DocumentNode.SelectNodes(@"//div[@id='some_id']/ul/li[4]").FirstOrDefault();

pero no sé cómo obtener este valor de intervalo.

actualizar

 <div id="some_id">
    <ul>
      <li><li>
      <li><li>
      <li><li>
      <li>
         Some text
        <span>text I want to grab</span>
      </li>
    </ul>
    </div>

Respuesta aceptada

Un enfoque alternativo (sin html-agility-pack) sería usar LINQ2XML . Puede usar el método XDocument.Descendants para tomar el elemento span y tomar su valor:

var xml = @" <div id=""some_id"">
<ul>
  <li></li>
  <li></li>
  <li></li>
  <li>
     Some text
    <span>text I want to grab</span>
  </li>
</ul>
</div>";
var doc = XDocument.Parse(xml);
Console.WriteLine(doc.Root.Descendants("span").FirstOrDefault().Value);

El código se puede ampliar para verificar si el elemento div tiene el id correspondiente, usando la propiedad XElement.Attribute :

var doc = XDocument.Parse(xml);
Console.WriteLine(doc.Elements("div").Where (e => e.Attribute("id").Value == "some_id").Descendants("span").FirstOrDefault().Value);

Un inconveniente de esta solución es que la estructura XML (HTML, XHTML) debe cerrarse correctamente o, de lo contrario, el análisis fallará.


Respuesta popular

No necesita analizar HTML con LINQ2XML, HTMLAgilityPack es para esto y es más fácil obtener el nodo de la siguiente manera:

var html = @" <div id=""some_id"">
  <ul>
    <li></li>
    <li></li>
    <li></li>
    <li>
      Some text
      <span>text I want to grab</span>
    </li>
  </ul>
</div>";

var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);

var value = doc.DocumentNode.SelectSingleNode("div[@id='some_id']/ul/li/span").InnerText;    
Console.WriteLine(value);


Related

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é