c # parse css utilizando ExCSS

c# css html html-agility-pack

Pregunta

Hace un tiempo busqué cómo analizar css y encontré ExCSS https://github.com/TylerBrinks/ExCSS

Tengo un archivo html. y necesito obtener el estilo de fuente de csFC2BB1D1

que es italic

para leer el html. Yo uso htmlagility pack. y uso ExCSS para analizar el css

y aqui esta mi codigo

HtmlDocument doc = new HtmlDocument();
doc.Load(htmlLocation);
var parser = new Parser();
var data = doc.DocumentNode.Descendants("style").FirstOrDefault();
var stylesheet = parser.Parse(data.OuterHtml);
foreach (var item in stylesheet.StyleRules
.Select(r => r.Selector)) {
     Console.WriteLine(item);
}

La salida de la sentencia de bucle es

HtmlDocument doc = new HtmlDocument();
doc.Load(htmlLocation);
var parser = new Parser();
var data = doc.DocumentNode.Descendants("style").FirstOrDefault();
var stylesheet = parser.Parse(data.OuterHtml);
foreach (var item in stylesheet.StyleRules
.Select(r => r.Selector)) {
     Console.WriteLine(item);
}

y por qué también genera el style type> texto style type> y no solo el selector

y este es mi documento html

HtmlDocument doc = new HtmlDocument();
doc.Load(htmlLocation);
var parser = new Parser();
var data = doc.DocumentNode.Descendants("style").FirstOrDefault();
var stylesheet = parser.Parse(data.OuterHtml);
foreach (var item in stylesheet.StyleRules
.Select(r => r.Selector)) {
     Console.WriteLine(item);
}

Respuesta aceptada

Debido a que está pasando, no solo el CSS sino también la etiqueta de style principal al analizador. Debería haber pasado solo el contenido de style utilizando InnerHtml lugar de OuterHtml . Luego puede hacer lo siguiente para obtener el estilo de fuente de destino:

// find among the CSS rules
var fontStyle = stylesheet.StyleRules
                  // rule for class `csFC2BB1D1`
                  .Where(r => r.Selector.ToString() == ".csFC2BB1D1")
                  // then select the value for `font-style`
                  .Select(o => o.Declarations.First(p => p.Name == "font-style").Term.ToString())
                  .First();

Aunque prefiero la sintaxis de consulta en este escenario:

// find among the CSS rules
var fontStyle = stylesheet.StyleRules
                  // rule for class `csFC2BB1D1`
                  .Where(r => r.Selector.ToString() == ".csFC2BB1D1")
                  // then select the value for `font-style`
                  .Select(o => o.Declarations.First(p => p.Name == "font-style").Term.ToString())
                  .First();

dotnetfiddle demo




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é