2016-01-09 16 views
6

Ở đây tôi đang cố gắng đọc url và nhận được hình ảnh trong một trang. Tôi cần phải loại trừ trang nếu nó là 404 và ngừng nhận hình ảnh từ trang lỗi 404. Làm thế nào để làm điều đó bằng cách sử dụng HtmlAgilityPack? Đây là mã của tôiCách kiểm tra xem đó có phải là trang lỗi 404 không (trang không tồn tại) bằng cách sử dụng HtmlAgilityPack

var document = new HtmlWeb().Load(completeurl); 
var urls = document.DocumentNode.Descendants("img") 
      .Select(e => e.GetAttributeValue("src", null)) 
      .Where(s => !String.IsNullOrEmpty(s)).ToList(); 
+0

Bạn cần kiểm tra trạng thái phản hồi trước khi tìm kiếm hình ảnh. – jdweng

+0

@jdweng có cách nào để kiểm tra biến tài liệu mà trang này không tồn tại không? – bala3569

Trả lời

5

Bạn sẽ cần phải đăng ký một sự kiện PostRequestHandler trên HtmlWeb dụ, nó sẽ được nâng lên sau mỗi tài liệu tải về và bạn sẽ nhận được quyền truy cập vào các đối tượng HttpWebResponse. Nó có một tài sản cho StatusCode.

HtmlWeb web = new HtmlWeb(); 
HttpStatusCode statusCode = HttpStatusCode.OK; 
web.PostRequestHandler += (request, response) => 
{ 
    if (response != null) 
    { 
     statusCode = response.StatusCode; 
    } 
} 

var doc = web.Load(completeUrl) 
if (statusCode == HttpStatusCode.OK) 
{ 
    // received a read document 
} 

Nhìn vào mã của HtmlAgilityPack trên GutHub, nó thậm chí còn đơn giản hơn, HtmlWeb có một tài sản StatusCode được thiết lập với các giá trị:

var web = new HtmlWeb(); 
var document = web.Load(completeurl); 

if (web.StatusCode == HttpStatusCode.OK) 
{ 
    var urls = document.DocumentNode.Descendants("img") 
      .Select(e => e.GetAttributeValue("src", null)) 
      .Where(s => !String.IsNullOrEmpty(s)).ToList(); 
} 
1

Hãy nhận biết của phiên bản bạn sử dụng!

Tôi đang sử dụng HtmlAgilityPack v1.5.1 và không có sự kiện PostRequestHandler.

Trong số v1.5.1, người dùng phải sử dụng trường PostResponse. Xem ví dụ bên dưới.

var htmlWeb = new HtmlWeb(); 
var lastStatusCode = HttpStatusCode.OK; 

htmlWeb.PostResponse = (request, response) => 
{ 
    if (response != null) 
    { 
     lastStatusCode = response.StatusCode; 
    } 
}; 

Không có nhiều khác biệt nhưng vẫn còn đó.

Hy vọng điều này sẽ tiết kiệm thời gian cho ai đó.

Các vấn đề liên quan