使用HtmlEntity.DeEntitize()方法的KeyNotFoundException

c# html-agility-pack keynotfoundexception

我目前正在研究用C#4.0编写的刮刀。我使用各种工具,包括.NET的内置WebClient和RegEx功能。对于我的刮刀的一部分,我正在使用HtmlAgilityPack解析HTML文档。我按照自己的意愿完成了所有工作,并完成了一些代码清理工作。

我正在使用HtmlEntity.DeEntitize()方法来清理HTML。我做了一些测试,这个方法看起来效果很好。但是当我在我的代码中实现该方法时,我一直得到KeyNotFoundException 。没有进一步的细节,所以我很丢失。我的代码如下所示:

WebClient client = new WebClient();
string html = HtmlEntity.DeEntitize(client.DownloadString(path));
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);

下载的HTML是UTF-8编码的。如何解决KeyNotFound异常?

热门答案

四年后,我对一些编码字符(版本1.4.9.5)也有同样的问题。在我的例子中,有一组有限的字符可能会产生问题,所以我刚刚创建了一个函数来执行替换:

// to be called before HtmlEntity.DeEntitize
public static string ReplaceProblematicHtmlEntities(string str)
{
    var sb = new StringBuilder(str);
    //TODO: add other replacements, as needed
    return sb.Replace(".", ".")
        .Replace("ă", "ă")
        .Replace("â", "â")
        .ToString();
}

在我的例子中,字符串包含html编码字符和UTF-8字符,但问题仅与某些编码字符有关。

这不是一个优雅的解决方案,而是快速修复所有具有有限(和已知)有问题的编码字符的文本。



Related

许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因