2012-11-07 69 views
6

我目前正在使用C#4.0編寫的scraper。我使用各種工具,包括.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

據我所知,問題是由於非標準字符的出現。說,例如,中國,日本等

後你會發現,哪些字符是引起問題,也許你可以尋找合適的補丁htmlagilitypack here

這可能是在對你有所幫助你想自己修改htmlagilitypack source

3

四年後,我對一些編碼字符(版本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; ...

儘管間距和小數點,它被解釋爲& 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);