Comment vérifier s'il s'agit d'une page d'erreur 404 (la page n'existe pas) à l'aide de HtmlAgilityPack

c# html-agility-pack

Question

Ici, j'essaie de lire les urls et de récupérer les images dans une page. Je dois exclure la page s'il s'agit du 404 et cesser de récupérer les images d'une page d'erreur 404. Comment faire en utilisant HtmlAgilityPack? Voici mon 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();

Réponse acceptée

Vous devez enregistrer un événement PostRequestHandler sur l'instance HtmlWeb . Il sera généré après chaque document téléchargé et vous aurez accès à l'objet HttpWebResponse . Il a une propriété pour le 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
 }

En regardant le code du HtmlAgilityPack sur GutHub, c'est encore plus simple, HtmlWeb a une propriété StatusCode qui est définie avec la valeur:

 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
 }

Mettre à jour

Une mise à jour de l'API AgilityPack a été mise à jour. Le truc reste le même:

 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
 }

Réponse populaire

Soyez conscient de la version que vous utilisez!

J'utilise HtmlAgilityPack v1.5.1 et il n'y a pas d'événement PostRequestHandler .

Dans la v1.5.1 il faut utiliser le champ PostResponse . Voir exemple ci-dessous.

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

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

Il n'y a pas beaucoup de différences mais elles le sont toujours.

J'espère que cela fera gagner du temps à quelqu'un.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi