HTMLAgilityPack 错误:“无法创建多个节点元素。”

Posted

技术标签:

【中文标题】HTMLAgilityPack 错误:“无法创建多个节点元素。”【英文标题】:HTMLAgilityPack error: "Multiple node elements can't be created." 【发布时间】:2019-04-19 18:03:56 【问题描述】:

我正在尝试使用 htmlAgilityPack 来检索和编辑某些 HTML 的内部文本。需要检查我检索到的每个节点的内部文本是否匹配字符串,并且这些匹配字符串要突出显示,如下所示:

var HtmlDoc = new HtmlDocument();
HtmlDoc.LoadHtml(item.Content);

var nodes = HtmlDoc.DocumentNode.SelectNodes("//div[@class='guide_subtitle_cell']/p");
foreach (HtmlNode htmlNode in nodes)

    htmlNode.ParentNode.ReplaceChild(HtmlTextNode.CreateNode(Methods.HighlightWords(htmlNode.InnerText, searchstring)), htmlNode);

这是我使用的 HighlightWords 方法的代码:

public static string HighlightWords(string input, string searchstring)
    
        if (input == null || searchstring == null)
        
            return input;
        

        var lowerstring = searchstring.ToLower();
        var words = lowerstring.Split(' ').ToList();

        for (var i = 0; i < words.Count; i++)
        
            Match m = Regex.Match(input, words[i], RegexOptions.IgnoreCase);

            if (m.Success)
            
                string ReplaceWord = string.Format("<span class='search_highlight'>0</span>", m.Value);
                input = Regex.Replace(input, words[i], ReplaceWord, RegexOptions.IgnoreCase);
            
        

        return input;

任何人都可以建议如何使其正常工作或指出我做错了什么吗?

【问题讨论】:

【参考方案1】:

问题是HtmlTextNode.CreateNode只能创建一个节点。当你在里面添加&lt;span&gt; 时,那是另一个节点,CreateNode 会抛出你看到的异常。

确保您只在最低的叶节点(没有子节点的节点)上进行搜索和替换。然后通过以下方式重建该节点:

    创建一个新的空节点来替换旧节点 在.InnerText中搜索文字 使用HtmlTextNode.Create 在您要突出显示的文本之前添加纯文本 然后添加您的新&lt;span&gt;HtmlNode.CreateNode 突出显示的文本 然后搜索下一个匹配项(从 1 开始),直到找不到更多匹配项。

【讨论】:

【参考方案2】:

您的函数 HighlightWords 必须返回多个*** HTML 节点。例如:

<p>foo</p>
<span>bar</span>

HtmlAgilityPack 只允许返回一个***节点。您可以硬编码 HighlightWords 的返回值以进行测试。

另外,this post 也遇到了同样的问题。

【讨论】:

以上是关于HTMLAgilityPack 错误:“无法创建多个节点元素。”的主要内容,如果未能解决你的问题,请参考以下文章

HTMLAgilityPack 错误:“无法创建多个节点元素。”

Android C# HtmlAgilityPack

如何使用 HtmlAgilityPack 获取表单中的所有输入元素而不会出现空引用错误

HtmlAgilityPack 总结

HtmlAgilityPack,使用 XPath 包含方法和谓词

HtmlAgilityPack - 找不到文件