El paquete de agilidad C# html obtiene elementos por nombre de clase

2 minutos de lectura

Estoy tratando de obtener todos los divs que su clase contiene una determinada palabra:

<div class="hello mike">content1</div>
<div class="hello jeff>content2</div>
<div class="john">content3</div>

Necesito obtener todos los divs que su clase contenga la palabra “hola”. Algo como esto:

resultContent.DocumentNode.SelectNodes("//div[@class="hello"]"))

¿Cómo puedo hacerlo con el paquete de agilidad?

Avatar de usuario de Ofer Gozlan
Ofer Gozlán

Lo tengo:

resultContent.DocumentNode.SelectNodes("//div[contains(@class, 'hello')]")

Avatar de usuario de Tohid
Esconder

A partir de la versión v1.6.5 de Html Agility Pack, contiene .HasClass("class-name") método de extensión.

IEnumerable<HtmlNode> nodes =
    htmlDoc.DocumentNode.Descendants(0)
        .Where(n => n.HasClass("class-name"));

  • Arriba es 5 veces más rápido que la respuesta más popular, aunque usé document.DocumentNode.Descendants().Where(x => x.HasClass(….

    – Jaycee

    28 de junio de 2019 a las 15:12


Estoy seguro porque hay varias clases en tu div, eso no funciona. Puedes probar esto en su lugar:

resultContent.DocumentNode.Descendants("div").Where(d => d.Attributes["class"].Value.Contains("hello"));

  • Tiene un inconveniente en comparación con la otra respuesta: arroja una excepción si hay un div sin class. Usa esto en su lugar: .Where(d => d.GetAttributeValue("class", "").Contains("hello"));

    – Tim Schmelter

    19 de abril de 2016 a las 8:01


como ha especificado que la clase debe contener una determinada palabra, lo siguiente garantizará que la palabra sea:

  • al comienzo de la cadena y seguido de un espacio
  • o en medio de la cadena y rodeado de espacios en blanco
  • o al final de la cadena y precedido por un espacio
  • o el único nombre de clase en el atributo de clase

Lo hace comparando el valor del atributo de clase rodeado de espacios con la palabra especificada (hello) rodeado de espacios. Esto es para evitar falsos positivos como class="something-hello-something"

resultContent.DocumentNode.SelectNodes("//div[contains(concat(' ', @class, ' '), ' hello ')]");

HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();
htmlDoc.Load(filePath);
 foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//div[@class="hello"]")
 {
    //code
 }

  • No funciona. OP intenta encontrar todos los divs donde la clase contiene una palabra como subcadena, por ejemplo hello. Está seleccionando solo divs donde la clase es hello

    – Tim Schmelter

    19 de abril de 2016 a las 8:03


  • No funciona. OP intenta encontrar todos los divs donde la clase contiene una palabra como subcadena, por ejemplo hello. Está seleccionando solo divs donde la clase es hello

    – Tim Schmelter

    19 de abril de 2016 a las 8:03


¿Ha sido útil esta solución?