2016-01-09 3 views
6

Hier versuche ich URLs zu lesen und die Bilder in einer Seite zu bekommen. Ich muss die Seite ausschließen, wenn es 404 ist, und aufhören, die Bilder von einer 404-Fehlerseite zu bekommen. Wie macht man das mit HtmlAgilityPack? Hier ist mein CodeWie überprüft man, ob es 404 Fehlerseite (Seite existiert nicht) mit 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

Sie müssen den Antwortstatus überprüfen, bevor Sie nach den Bildern suchen. – jdweng

+0

@jdweng gibt es eine Möglichkeit zum Einchecken der Dokumentvariablen, dass diese Seite nicht existiert? – bala3569

Antwort

5

Sie benötigen ein PostRequestHandler Ereignis auf der HtmlWeb Instanz registrieren, wird es nach jedem heruntergeladenen Dokument angehoben werden, und Sie werden Zugang zum HttpWebResponse Objekt erhalten. Es hat eine Eigenschaft für die 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 
} 

Mit Blick auf den Code des HtmlAgilityPack auf GutHub, ist es noch einfacher, hat HtmlWeb eine Eigenschaft StatusCode, die mit dem Wert gesetzt wird:

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

Beachten Sie die Version verwenden!

Ich verwende HtmlAgilityPack v1.5.1 und es gibt kein PostRequestHandler Ereignis.

In der v1.5.1 muss man PostResponse Feld verwenden. Siehe Beispiel unten.

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

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

Es gibt nicht viele Unterschiede, aber sie sind immer noch.

Hoffe, dass dies jemand Zeit sparen wird.

Verwandte Themen