Cómo verificar si es la página de error 404 (la página no existe) usando HtmlAgilityPack

c# html-agility-pack

Pregunta

Aquí estoy tratando de leer las URL y obtener las imágenes en una página. Necesito excluir la página si es 404 y dejar de obtener las imágenes de una página de error 404. ¿Cómo hacerlo usando HtmlAgilityPack? Aqui esta mi codigo

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

Respuesta aceptada

Deberá registrar un evento PostRequestHandler en la instancia de HtmlWeb , se generará después de cada documento descargado y obtendrá acceso al objeto HttpWebResponse . Tiene una propiedad para el 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
 }

Mirando el código del HtmlAgilityPack en GutHub, es aún más simple, HtmlWeb tiene una propiedad StatusCode que se establece con el valor:

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

Actualizar

Ha habido una actualización de la API de AgilityPack. El truco sigue siendo el mismo:

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

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

Respuesta popular

¡Sé consciente de la versión que usas!

Estoy usando HtmlAgilityPack v1.5.1 y no hay ningún evento PostRequestHandler .

En la v1.5.1 uno tiene que usar el campo PostResponse . Vea el ejemplo a continuación.

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

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

No hay muchas diferencias pero aún las hay.

Espero que esto le ahorre tiempo a alguien.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué