Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 验证本地硬盘上大型目录结构中的HTML链接_C#_Html_Optimization - Fatal编程技术网

C# 验证本地硬盘上大型目录结构中的HTML链接

C# 验证本地硬盘上大型目录结构中的HTML链接,c#,html,optimization,C#,Html,Optimization,我正在编写一个快速(希望是)的C#应用程序,在本地硬盘上的一个包中爬行,该包需要打开树中的每个html文件,并验证这些文件中的每个链接是否有效。我可以想出很多方法来实现这一点,从低级别的hrefs grep和dir/文件扫描到打开web浏览器并捕获404异常。我的问题更多的是效率问题,因为这必须在大量文件中发生。对于本地文件,我应该考虑使用什么方法?不要grep,这很容易出错。不要打开网络浏览器,那既有黑客味又很慢 我只需使用一些现有库解析HTML,提取所有HREF,转换为文件路径,并使用Sys

我正在编写一个快速(希望是)的C#应用程序,在本地硬盘上的一个包中爬行,该包需要打开树中的每个html文件,并验证这些文件中的每个链接是否有效。我可以想出很多方法来实现这一点,从低级别的hrefs grep和dir/文件扫描到打开web浏览器并捕获404异常。我的问题更多的是效率问题,因为这必须在大量文件中发生。对于本地文件,我应该考虑使用什么方法?

不要grep,这很容易出错。不要打开网络浏览器,那既有黑客味又很慢


我只需使用一些现有库解析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
    }
}