KeyNotFoundException с использованием метода HtmlEntity.DeEntitize()
В настоящее время я работаю над скребком, написанным на C# 4.0. Я использую различные инструменты, в том числе встроенные функции WebClient и RegEx.NET. Для части моего скребка я анализирую HTML-документ, используя HtmlAgilityPack. Я получил все, чтобы работать, как я хотел, и прошел некоторую очистку кода.
Я использую 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
исключение?
4 ответа
В моем HTML был такой блок текста:
... found in sections: 233.9 & 517.3; ...
Несмотря на интервал и десятичную точку, он интерпретировал & 517.3;
как символ юникода.
Простое 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);
Четыре года спустя и у меня та же проблема с некоторыми закодированными символами (версия 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, но проблема связана только с некоторыми кодированными символами.
Это не элегантное решение, но быстрое решение для всего текста с ограниченным (и известным) количеством проблемных закодированных символов.
Я понимаю, что проблема связана с появлением нестандартных символов. Скажем, например, китайский, японский и т. Д.
После того, как вы узнаете, какие символы вызывают проблемы, возможно, вы можете найти подходящий патч для htmlagilitypack здесь
Это может вам помочь, если вы захотите изменить исходный код htmlagilitypack самостоятельно.
В моем случае я исправил это, обновив HtmlAgilityPack до версии 1.5.0