2012-11-07 12 views
6

現在、C#4.0で書かれたスクレーパーを作成しています。私は、.NETの組み込みのWebClientとRegEx機能を含む、さまざまなツールを使用しています。私のスクレーパーの一部については、HtmlAgilityPackを使ってHTML文書を解析しています。私が望むようにすべてを動かし、コードのクリーンアップを行った。HtmlEntity.DeEntitize()メソッドを使用したKeyNotFoundException

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例外を回避するにはどうすればよいですか?

答えて

3

この問題は非標準文字の発生によるものだと私は理解しています。あなたはどのような文字が問題を引き起こしていることを見つけるの後で、あなたにいくつかの助けになることがあり、おそらくあなたはhere

これをhtmlagilitypackために、適切なパッチを検索でき言って、例えば、中国語、日本語など

あなた自身をhtmlagilitypack sourceに変更したい場合は、

3

4年後、いくつかのエンコードされた文字(バージョン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文字ですが、問題はエンコードされた文字にのみ関連しています。

これは洗練された解決策ではありませんが、問題のあるエンコードされた文字が限られている(および既知の)すべてのテキストをすばやく修正できます。

+0

私は 'HttpUtility.HtmlDecode」でこれらのケースを試してみましたが、それが唯一の『â』 – Setsu

+0

@Setsuの最後のケースを取り扱っ - 私は各文字をしようとしませんでした。私の入力テキスト(ルーマニア語のみ)に基づいて、私は問題のある文字のセットを知り、そのすべてを関数内に入れます。しかし、必要に応じて適応する必要があります。これはまともな解決策ではありませんが、後でHtmlAgillityPackがその魔法を実行できるようにします。 – Alexei

+0

おそらく私は間違っていますが、私はあなたがそのコメントで意味していたことを間違えたと思います。 'HttpUtility.HtmlDecode'は' System.Web'名前空間にあり、HtmlAgilityPackの代わりにフレームワークによって提供されます。私はそれがそれらの事件を処理したかどうかを知りたいだけでした。 – Setsu

2

私のHTMLはそうのようなテキストのブロックを持っていた:間隔と小数点にもかかわらず

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

が、それはUnicode文字として& 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); 
関連する問題