我前一阵子搜索如何解析CSS,发现ExCSS https://github.com/TylerBrinks/ExCSS

我有一个html文件。我需要得到csFC2BB1D1的字体样式

这是italic

为了阅读的HTML。我使用htmlagility包。我用ExCSS解析CSS

这是我的代码

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


循环语句的输出是

style type>.csC67CFA75
.cs3B0A1ABE
.cs6B2A4BAA
.cs7FB5C607
.csB0E2188C
.cs619CFE26
.cs80D9435B
.csE163F6C2
.cs5B41FA1C
.csC4CFBF3A
.csFC2BB1D1
.csC8468922
.cs21FA5D81
.cs95A8AE3D
.csCC736C83
.cs116BBDE0
.cs137E84BF
.cs6E4FDAEF
.cs92C3DA2B
.cs794D75A2
.csE6E4F8C4


为何还输出文本style type>而不是selector

这是我的html文件

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>
        </title>
        <style type="text/css">
            .csC67CFA75{text-align:center;text-indent:36pt;margin:0pt 0pt 0pt 0pt}
            .cs3B0A1ABE{color:#000000;background-color:transparent;font-family:Times New Roman;font-size:14pt;font-weight:normal;font-style:normal;}
            .cs6B2A4BAA{color:#000000;background-color:transparent;font-family:Times New Roman;font-size:6.5pt;font-weight:normal;font-style:normal;}
            .cs7FB5C607{text-align:justify;text-indent:36pt;margin:0pt 0pt 0pt 0pt}
            .csB0E2188C{color:#000000;background-color:transparent;font-family:Times New Roman;font-size:14pt;font-weight:bold;font-style:normal;}
            .cs619CFE26{color:#000000;background-color:transparent;font-family:Times New Roman;font-size:14pt;font-weight:normal;font-style:italic;}
            .cs80D9435B{text-align:justify;text-indent:0pt;margin:0pt 0pt 0pt 0pt}
            .csE163F6C2{color:#000000;background-color:transparent;font-family:Times New Roman;font-size:14pt;font-weight:bold;font-style:italic;}
            .cs5B41FA1C{color:#000000;background-color:transparent;font-family:Times New Roman;font-size:9pt;font-weight:normal;font-style:normal;}
            .csC4CFBF3A{color:#000000;background-color:transparent;font-family:Courier New;font-size:9pt;font-weight:normal;font-style:normal;}
            .csFC2BB1D1{color:#000000;background-color:transparent;font-family:Times New Roman;font-size:20pt;font-weight:normal;font-style:italic;}
            .csC8468922{color:#000000;background-color:transparent;font-family:Times New Roman;font-size:11pt;font-weight:normal;font-style:italic;}
            .cs21FA5D81{text-align:right;text-indent:36pt;margin:0pt 0pt 0pt 0pt}
            .cs95A8AE3D{color:#FF0000;background-color:transparent;font-family:Times New Roman;font-size:14pt;font-weight:normal;font-style:normal;}
            .csCC736C83{color:#000000;background-color:transparent;font-family:Times New Roman;font-size:9pt;font-weight:normal;font-style:italic;}
            .cs116BBDE0{color:#000000;background-color:transparent;font-family:Times New Roman;font-size:7pt;font-weight:normal;font-style:normal;}
            .cs137E84BF{text-align:justify;text-indent:0pt;margin:0pt 36pt 0pt 36pt}
            .cs6E4FDAEF{color:#000000;background-color:#FFFF00;font-family:Times New Roman;font-size:14pt;font-weight:normal;font-style:normal;}
            .cs92C3DA2B{color:#000000;background-color:transparent;font-family:Times New Roman;font-size:14pt;font-weight:normal;font-style:normal;text-decoration: underline;}
            .cs794D75A2{color:#FFFF00;background-color:transparent;font-family:Times New Roman;font-size:9pt;font-weight:normal;font-style:normal;}
            .csE6E4F8C4{color:#000000;background-color:transparent;font-family:Times New Roman;font-size:8pt;font-weight:normal;font-style:normal;}
        </style>
    </head>
    <body>
</body>
</html>

最佳答案

因为要传递,所以解析器不仅传递CSS,而且传递父style标记。您应该只使用style而不是InnerHtml传递OuterHtml的内容。然后,您可以执行以下操作以获得目标字体样式:

// 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();


我在这种情况下更喜欢查询语法:

var query = from rule in stylesheet.StyleRules
            where rule.Selector.ToString() == ".csFC2BB1D1"
            from declaration in rule.Declarations
            where declaration.Name == "font-style"
            select declaration.Term.ToString();

var fontStyle = query.FirstOrDefault();


dotnetfiddle demo

关于c# - C#使用ExCSS解析CSS,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42945704/

10-10 23:12