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

Другие вопросы по тегам