如何使用HtmlAgilityPack检查是否为404错误页面(页面不存在)

本文关键字:不存在 错误 HtmlAgilityPack 何使用 检查 是否 | 更新日期: 2023-09-27 18:29:34

这里我正在尝试读取url并获取页面中的图像。如果页面为404,我需要排除该页面,并停止从404错误页面获取图像。如何使用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();

如何使用HtmlAgilityPack检查是否为404错误页面(页面不存在)

您需要在HtmlWeb实例上注册一个PostRequestHandler事件,它将在每个下载的文档后引发,并且您可以访问HttpWebResponse对象。它具有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
 }

看看GitHub上HtmlAgilityPack的代码,它甚至更简单,HtmlWeb有一个属性StatusCode,该属性设置为值:

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

更新

对AgilityPack API进行了更新。诀窍仍然是一样的:

var htmlWeb = new HtmlWeb();
var lastStatusCode = HttpStatusCode.OK;
htmlWeb.PostResponse = (request, response) =>
{
    if (response != null)
    {
        lastStatusCode = response.StatusCode;
    }
};

请注意您使用的版本

我使用的是HtmlAgilityPack v1.5.1,没有PostRequestHandler事件。

v1.5.1中,必须使用PostResponse字段。请参阅下面的示例。

var htmlWeb = new HtmlWeb();
var lastStatusCode = HttpStatusCode.OK;
htmlWeb.PostResponse = (request, response) =>
{
    if (response != null)
    {
        lastStatusCode = response.StatusCode;
    }
};

差别不大,但仍然存在。

希望这能为某人节省一些时间。