C# 验证本地硬盘上大型目录结构中的HTML链接
我正在编写一个快速(希望是)的C#应用程序,在本地硬盘上的一个包中爬行,该包需要打开树中的每个html文件,并验证这些文件中的每个链接是否有效。我可以想出很多方法来实现这一点,从低级别的hrefs grep和dir/文件扫描到打开web浏览器并捕获404异常。我的问题更多的是效率问题,因为这必须在大量文件中发生。对于本地文件,我应该考虑使用什么方法?不要grep,这很容易出错。不要打开网络浏览器,那既有黑客味又很慢C# 验证本地硬盘上大型目录结构中的HTML链接,c#,html,optimization,C#,Html,Optimization,我正在编写一个快速(希望是)的C#应用程序,在本地硬盘上的一个包中爬行,该包需要打开树中的每个html文件,并验证这些文件中的每个链接是否有效。我可以想出很多方法来实现这一点,从低级别的hrefs grep和dir/文件扫描到打开web浏览器并捕获404异常。我的问题更多的是效率问题,因为这必须在大量文件中发生。对于本地文件,我应该考虑使用什么方法?不要grep,这很容易出错。不要打开网络浏览器,那既有黑客味又很慢 我只需使用一些现有库解析HTML,提取所有HREF,转换为文件路径,并使用Sys
我只需使用一些现有库解析HTML,提取所有HREF,转换为文件路径,并使用
System.IO.file.Exists
检查文件是否存在,这很容易出错。不要打开网络浏览器,那既有黑客味又很慢
我只需使用一些现有库解析HTML,提取所有HREF,转换为文件路径,并使用
System.IO.file.Exists
检查文件是否存在,这很容易出错。不要打开网络浏览器,那既有黑客味又很慢
我只需使用一些现有库解析HTML,提取所有HREF,转换为文件路径,并使用
System.IO.file.Exists
检查文件是否存在,这很容易出错。不要打开网络浏览器,那既有黑客味又很慢
我只需要使用一些现有库解析HTML,提取所有HREF,转换为文件路径,并使用
System.IO.file.Exists
检查文件是否存在。我猜这是一个在您控制下的项目。在这种情况下,您发现的任何错误都计划修复或让他人修复。此外,如果您希望在文件中爬行,并且觉得这会给您带来一些好处,那么这就是全部或大部分静态HTML。如果所有这些假设都是正确的,那么我实际上建议使用Regex,因为这可能会引起其他问题中那些说不能用Regex“解析html”的人的愤怒。IMHO,您正在查找href=“url”或src=“url”。这不应该特别容易出错。您可能会错过一些东西,但您不需要解析整个HTMLDOM来找到这两个相对简单的模式
也就是说,如果我这样做的话,我会循环遍历Regex.Matches,然后使用Path.Combine将相对路径和根文件夹合并,并使用File.Exists,就像Sebastian建议的那样。对于外部的绝对URL,我将使用HttpWebRequest。此外,我会将所有请求排队,并使响应异步。我猜这是一个在您控制下的项目。在这种情况下,您发现的任何错误都计划修复或让他人修复。此外,如果您希望在文件中爬行,并且觉得这会给您带来一些好处,那么这就是全部或大部分静态HTML。如果所有这些假设都是正确的,那么我实际上建议使用Regex,因为这可能会引起其他问题中那些说不能用Regex“解析html”的人的愤怒。IMHO,您正在查找href=“url”或src=“url”。这不应该特别容易出错。您可能会错过一些东西,但您不需要解析整个HTMLDOM来找到这两个相对简单的模式
也就是说,如果我这样做的话,我会循环遍历Regex.Matches,然后使用Path.Combine将相对路径和根文件夹合并,并使用File.Exists,就像Sebastian建议的那样。对于外部的绝对URL,我将使用HttpWebRequest。此外,我会将所有请求排队,并使响应异步。我猜这是一个在您控制下的项目。在这种情况下,您发现的任何错误都计划修复或让他人修复。此外,如果您希望在文件中爬行,并且觉得这会给您带来一些好处,那么这就是全部或大部分静态HTML。如果所有这些假设都是正确的,那么我实际上建议使用Regex,因为这可能会引起其他问题中那些说不能用Regex“解析html”的人的愤怒。IMHO,您正在查找href=“url”或src=“url”。这不应该特别容易出错。您可能会错过一些东西,但您不需要解析整个HTMLDOM来找到这两个相对简单的模式
也就是说,如果我这样做的话,我会循环遍历Regex.Matches,然后使用Path.Combine将相对路径和根文件夹合并,并使用File.Exists,就像Sebastian建议的那样。对于外部的绝对URL,我将使用HttpWebRequest。此外,我会将所有请求排队,并使响应异步。我猜这是一个在您控制下的项目。在这种情况下,您发现的任何错误都计划修复或让他人修复。此外,如果您希望在文件中爬行,并且觉得这会给您带来一些好处,那么这就是全部或大部分静态HTML。如果所有这些假设都是正确的,那么我实际上建议使用Regex,因为这可能会引起其他问题中那些说不能用Regex“解析html”的人的愤怒。IMHO,您正在查找href=“url”或src=“url”。这不应该特别容易出错。您可能会错过一些东西,但您不需要解析整个HTMLDOM来找到这两个相对简单的模式 也就是说,如果我这样做的话,我会循环遍历Regex.Matches,然后使用Path.Combine将相对路径和根文件夹合并,并使用File.Exists,就像Sebastian建议的那样。对于外部的绝对URL,我将使用HttpWebRequest。此外,我会将所有请求排队,并使响应异步。使用: 上面的代码大部分来自 您可能需要在
href
attr.上进行一些额外的工作,使用:
HtmlDocument doc = new HtmlDocument();
doc.Load("file.htm");
foreach(HtmlNode link in doc.DocumentNode.SelectNodes("//a[@href]")) {
if(System.IO.File.Exists(link.Attributes["href"].Value))
{
//your file exists
}
}