【问题标题】:HtmlAgilityPack C# Nested divsHtmlAgilityPack C# 嵌套 div
【发布时间】:2017-06-22 17:07:43
【问题描述】:

假设我有一个这样的 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 时只返回文本“MyText Here”?没有其他div?或者有其他方法吗?

【问题讨论】:

    标签: c# html html-agility-pack


    【解决方案1】:

    您可以使用如下所示的内容。我发现使用正则表达式并不适合解析 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);
            }
    

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-14
      • 1970-01-01
      • 2012-09-11
      • 1970-01-01
      • 2011-09-12
      相关资源
      最近更新 更多