【问题标题】:KeyNotFoundException with using HtmlEntity.DeEntitize() methodKeyNotFoundException 使用 HtmlEntity.DeEntitize() 方法
【发布时间】:2012-11-07 18:12:35
【问题描述】:

我目前正在开发一个用 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 异常?

【问题讨论】:

    标签: c# html-agility-pack keynotfoundexception


    【解决方案1】:

    我了解问题是由于出现了非标准字符。比如说中文、日文等。

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 出于好奇,我用 `HttpUtility.HtmlDecode' 尝试了这些案例,它只处理了最后一个案例“â”
      • @Setsu - 我没有尝试每个角色。根据我的输入文本(仅限罗马尼亚语),我知道有问题的字符集并将它们全部放在函数中。但是,应该根据需要进行调整。这不是一个不错的解决方案,但它使 HtmlAgillityPack 能够在之后发挥其魔力。
      • 也许我错了,但我认为您误解了我的意思。 HttpUtility.HtmlDecode 位于 System.Web 命名空间中,由框架提供,而不是 HtmlAgilityPack。我只是想看看它是否处理了这些案件。
      • @Setsu - 是的,对不起。你说的对。我已经尝试过HttpUtility.HtmlDecode 并且只能部分工作。
      【解决方案3】:

      我的 HTML 有一个这样的文本块:

      ... found in sections: 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);
      

      【讨论】:

        【解决方案4】:

        在我的情况下,我通过将 HtmlAgilityPack 更新到版本 1.5.0 解决了这个问题

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-07-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-21
          • 1970-01-01
          相关资源
          最近更新 更多