8

私は現在、C# 4.0 で書かれたスクレイパーに取り組んでいます。組み込みの WebClient や .NET の 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例外を回避できますか?

4

4 に答える 4

3

規格外文字の発生による不具合とのこと、承知いたしました。たとえば、中国語、日本語など。

どの文字が問題を引き起こしているかがわかったら、ここでhtmlagilitypack への適切なパッチを検索できます。

これは、 htmlagilitypack ソースを自分で変更する場合に役立つ場合があります。

于 2012-11-18T15:33:49.727 に答える
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 文字の両方が含まれていますが、問題は一部のエンコードされた文字のみに関連しています。

これは洗練された解決策ではありませんが、問題のあるエンコードされた文字の量が限られている (そして既知の) すべてのテキストに対する迅速な修正です。

于 2017-03-20T20:56:57.597 に答える
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);
于 2017-05-10T19:29:47.047 に答える