Come verificare se la pagina di errore 404 (pagina non esiste) utilizzando HtmlAgilityPack

c# html-agility-pack

Domanda

Qui sto cercando di leggere gli URL e ottenere le immagini in una pagina. Devo escludere la pagina se è 404 e smettere di ricevere le immagini da una pagina di errore 404. Come farlo usando HtmlAgilityPack? Ecco il mio codice

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

Risposta accettata

Avrai bisogno di registrare un PostRequestHandler evento sul HtmlWeb esempio, verrà sollevata dopo ogni documento scaricato e si otterrà l'accesso alla HttpWebResponse oggetto. Ha una proprietà per il 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
 }

Guardando il codice di HtmlAgilityPack su GutHub, è ancora più semplice, HtmlWeb ha una proprietà StatusCode che viene impostata con il valore:

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

Aggiornare

È stato aggiornato l'API AgilityPack. Il trucco è sempre lo stesso:

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

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

Risposta popolare

Sii consapevole della versione che usi!

Sto usando HtmlAgilityPack v1.5.1 e non c'è nessun evento PostRequestHandler .

Nella v1.5.1 si deve usare il campo PostResponse . Vedi l'esempio qui sotto.

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

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

Non ci sono molte differenze, ma lo sono ancora.

Spero che questo salverà un po 'di tempo a qualcuno.



Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché