2012-11-07 7 views
6

Ich arbeite derzeit an einem Schaber in C# 4.0 geschrieben. Ich verwende eine Vielzahl von Tools, einschließlich der integrierten WebClient- und RegEx-Funktionen von .NET. Für einen Teil meines Scraper analysiere ich ein HTML-Dokument mit HtmlAgilityPack. Ich habe alles wie gewünscht arbeiten lassen und habe den Code überarbeitet.KeyNotFoundException mit der HtmlEntity.DeEntitise() -Methode

Ich verwende die HtmlEntity.DeEntitize() Methode, um das HTML zu bereinigen. Ich machte ein paar Tests und die Methode schien großartig zu funktionieren. Aber als ich die Methode in meinem Code implementierte, bekam ich KeyNotFoundException. Es gibt keine weiteren Details, also bin ich ziemlich verloren. Mein Code sieht so aus:

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

Das heruntergeladene HTML ist UTF-8 codiert. Wie kann ich die Ausnahme KeyNotFound umgehen?

Antwort

3

Ich verstehe, dass das Problem auf das Auftreten von Nicht-Standard-Zeichen zurückzuführen ist. Sagen Sie zum Beispiel Chinesisch, Japanisch usw.

Nachdem Sie herausfinden, dass das, was Zeichen ein Problem verursachen, vielleicht Sie für den geeigneten Patch suchen könnte htmlagilitypack here

Dies Ihnen eine Hilfe sein kann, in Wenn Sie die htmlagilitypack source selbst ändern möchten.

3

Vier Jahre später und ich habe das gleiche Problem mit einigen codierten Zeichen (Version 1.4.9.5). In meinem Fall gibt es eine begrenzte Menge von Zeichen ist, die das Problem erzeugen könnte, so habe ich nur eine Funktion auszuführen, die Ersatz geschaffen:

// 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(); 
} 

In meinem Fall enthält die Zeichenfolge beide HTML-kodierte Zeichen und UTF -8 Zeichen, aber das Problem bezieht sich nur auf einige codierte Zeichen.

Dies ist keine elegante Lösung, sondern eine schnelle Lösung für all diese Texte mit einer begrenzten (und bekannten) Anzahl problematischer codierter Zeichen.

+0

Aus Neugier habe ich versucht, diese Fälle mit 'HttpUtility.HtmlDecode‘ und behandeln nur den letzten Fall von ‚â‘ – Setsu

+0

@Setsu - ich nicht jedes Zeichen versucht habe. Basierend auf meinem Eingabetext (nur in rumänischer Sprache) kenne ich die problematischen Zeichen und stelle sie alle in die Funktion. Allerdings sollte man sich nach Bedarf anpassen. Dies ist keine vernünftige Lösung, aber es ermöglicht HtmlAgillityPack danach, seine Magie zu tun. – Alexei

+0

Vielleicht irre ich mich, aber ich glaube, du hast verwechselt, was ich mit diesem Kommentar meinte. 'HttpUtility.HtmlDecode' lebt im Namespace' System.Web' und wird vom Framework anstelle von HtmlAgilityPack bereitgestellt. Ich war nur neugierig, ob es diese Fälle behandelt. – Setsu

2

hatte mein HTML einen Textblock wie folgt:

... found in sections: 233.9 & 517.3; ...

Trotz des Abstandes und Komma, wurde & 517.3; als Unicode-Zeichen zu interpretieren.

Einfach HTML-Codierung den Rohtext das Problem für mich behoben.

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