HtmlAgilityPack C#嵌套div

时间:2017-06-22 17:07:43

标签: c# html html-agility-pack

说我有一个像这样的HTML文档:

<!DOCTYPE html>
<html>
<head>
    <title>MyTest</title>
</head>
<body>
    <div id="p_123">
        MyText Here
        <div id="p_456">
            MyText Again
        </div>
    </div>
</body>
</html>

我尝试使用替换正则表达式使用HtmlAgilityPack解析它,该正则表达式将搜索文本包装在span标记中以突出显示。因此,生成的突出显示文本应如下所示:

<!DOCTYPE html>
<html>
<head>
    <title>MyTest</title>
</head>
<body>
    <div id="p_123">
        <span class="highlighted">MyText</span> Here
        <div id="p_456">
            <span class="highlighted">MyText</span> Again
        </div>
    </div>
</body>
</html>

问题是,如果我遍历div,我最终会在div p_456上突出显示两次,因为p_123也包含p_456。实际结果如下:

<!DOCTYPE html>
<html>
<head>
    <title>MyTest</title>
</head>
<body>
    <div id="p_123">
        <span class="highlighted">MyText</span> Here
        <div id="p_456">
            <span class="highlighted"><span class="highlighted">MyText</span></span> Again
        </div>
    </div>
</body>
</html>

我使用的代码如下:

HtmlDocument doc = new HtmlDocument();
doc.Load(someDataStream);
foreach (HtmlNode n in doc.DocumentNode)
{
    string evaluator = m => "<span class=\"highlighted\">" + m.Value + "</span>";
    n.InnerText = Regex.Replace(n.InnerText, "MyText", evaluator);
}

有没有办法让我选择p_123的InnerText时,它只返回文字&#34; MyText Here&#34;?没有其他div?或者还有另一种方法吗?

1 个答案:

答案 0 :(得分:0)

您可以使用以下内容。我发现使用Regex并不适合解析HTML

        HtmlDocument document = new HtmlDocument();
        document.LoadHtml(html);

        foreach(var n in document.DocumentNode.Descendants("div"))
        {
            var oldChild = n.FirstChild;
            var newNode = document.CreateElement("span");
            newNode.InnerHtml = oldChild.InnerText;
            newNode.Attributes.Add("class", "highlighted");
            n.ReplaceChild(newNode, oldChild);
        }