使用LINQ过滤List不改变变量类型
本文关键字:改变 变量 类型 string LINQ 过滤 List 使用 | 更新日期: 2023-09-27 17:50:47
我正在用c#写一个网络爬虫。在获得页面上所有链接的方法中,我想返回链接列表,但使用LINQ"过滤"它,以便该列表仅包含存在的url。我有一个名为RemoteFileExists的辅助方法,它返回一个布尔值。在该方法的末尾,我编写了以下LINQ行:
//Links is a List<string> that hasn't been filtered
return (from link in Links
where RemoteFileExists(link)
select link).ToList<string>();
由于某些原因,当我这样做时,List返回空。
RemoteFileExists:
static bool RemoteFileExists(string url)
{
try
{
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.Method = "HEAD";
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
return (response.StatusCode == HttpStatusCode.OK);
}
catch
{
return false;
}
我猜要么你的链接不正确,要么你的网站不支持HEAD
。因为这段代码可以工作
List<string> Links = new List<string>() {"http://www.google.com"};
var res = ( from link in Links
where RemoteFileExists(link)
select link).ToList<string>();
我一直在我的代码中使用RemoteFileExists方法。有时程序挂起是因为请求没有关闭。现在我使用下面的代码:
static bool RemoteFileExists(string url)
{
try
{
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.Method = "HEAD";
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
response.Close();
return (response.StatusCode == HttpStatusCode.OK);
}
catch
{
return false;
}
}
同样,上面的代码不检测重定向。这对爬行器很重要,因为您需要知道何时前进到另一个页面,而不是跟随重定向到同一页面。