使用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字符,但問題僅與某些編碼字符有關。

這不是一個優雅的解決方案,而是快速修復所有具有有限(和已知)有問題的編碼字符的文本。




許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因