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?
Ofer Gozlán
Lo tengo:
resultContent.DocumentNode.SelectNodes("//div[contains(@class, 'hello')]")
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 eshello
– 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 eshello
– Tim Schmelter
19 de abril de 2016 a las 8:03