Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用HtmlEntity.deentize()方法的KeyNotFoundException_C#_Html Agility Pack_Keynotfoundexception - Fatal编程技术网

C# 使用HtmlEntity.deentize()方法的KeyNotFoundException

C# 使用HtmlEntity.deentize()方法的KeyNotFoundException,c#,html-agility-pack,keynotfoundexception,C#,Html Agility Pack,Keynotfoundexception,我目前正在使用C#4.0编写的刮板。我使用各种工具,包括.NET的内置WebClient和RegEx功能。作为我的scraper的一部分,我正在使用HtmlAgilityPack解析一个HTML文档。我得到了我想要的一切工作,并经历了一些代码清理 我正在使用HtmlEntity.deentize()方法清理HTML。我做了一些测试,这个方法似乎很有效。但是当我在代码中实现该方法时,我不断得到KeyNotFoundException。没有进一步的细节,所以我很迷茫。我的代码如下所示: WebCli

我目前正在使用C#4.0编写的刮板。我使用各种工具,包括.NET的内置WebClient和RegEx功能。作为我的scraper的一部分,我正在使用HtmlAgilityPack解析一个HTML文档。我得到了我想要的一切工作,并经历了一些代码清理

我正在使用
HtmlEntity.deentize()
方法清理HTML。我做了一些测试,这个方法似乎很有效。但是当我在代码中实现该方法时,我不断得到
KeyNotFoundException
。没有进一步的细节,所以我很迷茫。我的代码如下所示:

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

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

我知道问题是由于出现了非标准字符。比如说,汉语、日语等

在您发现是什么字符导致了问题之后,也许您可以搜索到htmlagilitypack的合适补丁


如果您想自己修改,这可能会对您有所帮助。

四年后,我对一些编码字符(版本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字符,但问题只与一些编码字符有关


这不是一个优雅的解决方案,而是一个快速解决方案,适用于所有具有有限(且已知)数量的有问题编码字符的文本。

我的HTML有一个如下所示的文本块:

。。。见第233.9和517.3节

尽管有空格和小数点,它还是解释了
&517.3
作为unicode字符

对原始文本进行简单的HTML编码就解决了这个问题

string raw = "sections: 233.9 & 517.3;";
// turn '&' into '&', etc, before DeEntitizing
string encoded = System.Web.HttpUtility.HtmlEncode(raw);
string deEntitized = HtmlEntity.DeEntitize(encoded);

在我的例子中,我通过将HtmlAgilityPack更新到1.5.0版来解决这个问题。出于好奇,我用“HttpUtility.HtmlDecode”尝试了这些案例,它只处理了“â;”@Setsu的最后一个案例-我没有尝试每个字符。根据我的输入文本(仅限罗马尼亚语),我知道有问题的字符集,并将它们全部放在函数中。然而,人们应该根据需要进行调整。这不是一个很好的解决方案,但它让HtmlagillyPack在事后发挥了它的魔力。也许我错了,但我认为你误解了我的意思
HttpUtility.HtmlDecode
位于
System.Web
命名空间中,由框架提供,而不是由HtmlAgilityPack提供。我只是想看看它是否处理过这些案件。@Setsu-是的,对不起。你是对的。我已经尝试了
HttpUtility.HtmlDecode
,但仅部分有效。