Wie überprüft man, ob es eine 404-Fehlerseite (Seite existiert nicht) mit HtmlAgilityPack gibt

c# html-agility-pack

Frage

Hier versuche ich URLs zu lesen und die Bilder auf 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 Code

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

Akzeptierte Antwort

Sie müssen ein PostRequestHandler Ereignis in der HtmlWeb Instanz registrieren. Es wird nach jedem heruntergeladenen Dokument HttpWebResponse und Sie erhalten Zugriff auf das HttpWebResponse Objekt. Es hat eine Eigenschaft für den 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
 }

Betrachtet man den Code des HtmlAgilityPack auf GutHub, ist es noch einfacher, HtmlWeb hat 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();
}

Aktualisieren

Die AgilityPack-API wurde aktualisiert. Der Trick ist immer noch der gleiche:

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

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

Beliebte Antwort

Beachten Sie die Version, die Sie verwenden!

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

In v1.5.1 muss das PostResponse Feld verwendet werden. 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 es immer noch.

Hoffe, das wird jemandem Zeit sparen.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum