c# - 如何检查它是否是 404 错误页面并使用 HtmlAgilityPack 执行某些操作
问题描述
我正在尝试使用 HtmlAgilityPack 从不同的 url 获取多个数据。
- 它将获得产品价格。
- 但是当产品库存为 0 时。他们正在关闭页面。
我的程序将价格添加到列表框。当页面给出 404 它应该添加空列表框项。
有什么办法可以让程序更简单?我不能在同一个按钮上使用相同的变量。我正在添加相同的代码来更改数字 (6)。
WebRequest SiteyeBaglantiTalebi06 = HttpWebRequest.Create("https://www.themia.com.tr/The-Mia-Dekor-Mermer-22-Cm-Gri,PR-2432.html");
WebResponse GelenCevap06 = SiteyeBaglantiTalebi06.GetResponse();
StreamReader CevapOku06 = new StreamReader(GelenCevap06.GetResponseStream());
string KaynakKodlar06 = CevapOku06.ReadToEnd();
int IcerikBaslangicIndex06 = KaynakKodlar06.IndexOf("<div class=\"productPrice\">") + 122;
int IcerikBitisIndex06 = KaynakKodlar06.Substring(IcerikBaslangicIndex06).IndexOf("</div>");
listBox3.Items.Add((KaynakKodlar06.Substring(IcerikBaslangicIndex06, IcerikBitisIndex06)));
解决方案
如果您将其WebResponse
转换为HttpWeResponse
您可以访问的StatusCode
属性 - https://docs.microsoft.com/en-us/dotnet/api/system.net.httpwebresponse.statuscode?view=netframework-4.7.2#System_Net_HttpWebResponse_StatusCode;
只需要注意一件事 - 当 HttpWebRequest 收到不表示成功的状态代码时,您不能让 HttpWebRequest 不抛出异常(更有理由不使用此方法)。这意味着您必须准备好捕获将引发的异常。
因此,在您的示例中,它将是-
WebRequest SiteyeBaglantiTalebi06 = HttpWebRequest.Create("https://www.somesite.com/NotARealPath");
try
{
WebResponse GelenCevap06 = SiteyeBaglantiTalebi06.GetResponse();
// do things with the result
}
catch (WebException ex)
{
using (WebResponse response = ex.Response)
{
HttpWebResponse asHttp = (HttpWebResponse)response;
if (asHttp.StatusCode == System.Net.HttpStatusCode.NotFound)
{
// your 404 logic here
}
else
{
// your "something went wrong but it's not a 404" logic
}
}
}
至于使代码更简单 - 如果不了解更多关于您的程序和您正在尝试做什么,就很难准确理解您的意思。总的来说,这里有一些想法 -
- 停止使用 HttpWebRequest - 这是一篇很好的文章,详细说明了原因以及您的其他(和更好的)选项是什么 - https://www.diogonunes.com/blog/webclient-vs-httpclient-vs-httpwebrequest/
- 将反复使用的代码放入方法中,而不仅仅是复制/粘贴它 - https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/methods
- 使用命令模式以更聪明的方式绑定您的按钮点击,您是否可以传递参数(或至少使用此 SO 答案中的“简单”方法) -将参数添加到按钮点击事件
推荐阅读
- php - 在magento 2中注册后打印客户的数据
- sql-server - 是否可以在 EF 迁移的 Up 方法中更改命令超时?
- react-native - 在 API 调用上遇到问题,我正在返回类似 Unauthorized 的响应
- tensorflow-datasets - 是否有合理的方法来创建 tff 客户端数据集?
- cron - Centos7 无法运行@reboot 命令
- php - 从数组中获取单个值
- python - 如何更好地自动化需要多个程序和 URL 的程序
- linux - 将数组传递给 SSH 连接
- android - Gradle 重复库没有省略
- reactjs - 更改 dropzone-material-ui 中的段落样式