2012-11-07 30 views
6

Tôi hiện đang làm việc trên một scraper được viết bằng C# 4.0. Tôi sử dụng nhiều công cụ, bao gồm các tính năng WebClient và RegEx tích hợp của .NET. Đối với một phần của scraper của tôi tôi phân tích cú pháp một tài liệu HTML bằng cách sử dụng HtmlAgilityPack. Tôi có tất cả mọi thứ để làm việc như tôi mong muốn và đã đi qua một số dọn dẹp của mã.KeyNotFoundException khi sử dụng phương thức HtmlEntity.DeEntitize()

Tôi đang sử dụng phương pháp HtmlEntity.DeEntitize() để xóa HTML. Tôi đã thực hiện một vài thử nghiệm và phương pháp này dường như hoạt động tốt. Nhưng khi tôi thực hiện phương pháp trong mã của tôi, tôi tiếp tục nhận được KeyNotFoundException. Không có thêm chi tiết nào nên tôi khá lạc. Mã của tôi trông giống như sau:

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

HTML được tải xuống được mã hóa UTF-8. Làm thế nào tôi có thể nhận được xung quanh ngoại lệ KeyNotFound?

Trả lời

3

Tôi hiểu rằng vấn đề là do sự xuất hiện của các ký tự không chuẩn. Nói, ví dụ, Trung Quốc, Nhật Bản, vv

Sau khi bạn tìm ra rằng những gì nhân vật đang gây ra một vấn đề, có lẽ bạn có thể tìm kiếm các bản vá phù hợp với HtmlAgilityPack here

Điều này có thể giúp đỡ một số bạn trong trường hợp bạn muốn tự sửa đổi htmlagilitypack source.

3

Bốn năm sau và tôi gặp vấn đề tương tự với một số ký tự được mã hóa (phiên bản 1.4.9.5). Trong trường hợp của tôi, có một tập hạn chế các nhân vật mà có thể tạo ra các vấn đề, vì vậy tôi đã vừa tạo ra một chức năng để thực hiện các thay thế:

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

Trong trường hợp của tôi, chuỗi chứa cả ký tự html mã hóa và UTF -8 ký tự, nhưng vấn đề chỉ liên quan đến một số ký tự được mã hóa.

Đây không phải là một giải pháp thanh lịch, nhưng sửa chữa nhanh chóng cho tất cả các văn bản đó với số ký tự được mã hóa có giới hạn (và đã biết).

+0

Ra khỏi tò mò tôi đã cố gắng những trường hợp này với 'HttpUtility.HtmlDecode' và nó chỉ xử lý các trường hợp cuối cùng của 'â' – Setsu

+0

@Setsu - Tôi không cố gắng mỗi nhân vật. Dựa trên văn bản đầu vào của tôi (chỉ có ngôn ngữ Rumani), tôi biết tập hợp các ký tự có vấn đề và đặt tất cả chúng vào trong hàm. Tuy nhiên, người ta phải thích ứng khi cần thiết. Đây không phải là một giải pháp tốt, nhưng nó cho phép HtmlAgillityPack làm phép thuật của nó sau đó. – Alexei

+0

Có lẽ tôi đã sai nhưng tôi nghĩ bạn đã nhầm lẫn ý tôi là gì. 'HttpUtility.HtmlDecode' tồn tại trong không gian tên' System.Web' và được cung cấp bởi khung công tác, thay vì HtmlAgilityPack. Tôi chỉ tò mò muốn xem liệu nó có xử lý những trường hợp đó hay không. – Setsu

2

HTML tôi đã có một khối văn bản như sau:

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

Mặc dù khoảng cách và dấu thập phân, nó đã giải thích & 517.3; như một ký tự unicode.

Đơn giản chỉ cần HTML Mã hóa văn bản thô đã khắc phục sự cố cho tôi.

string raw = "sections: 233.9 & 517.3;"; 
// turn '&' into '&', etc, before DeEntitizing 
string encoded = System.Web.HttpUtility.HtmlEncode(raw); 
string deEntitized = HtmlEntity.DeEntitize(encoded); 
Các vấn đề liên quan