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

本文关键字:结构 HTML 链接 硬盘 验证 | 更新日期: 2023-09-27 18:30:14

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

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

不要grep,这很容易出错。不要打开网络浏览器,这既麻烦又慢。

我只需要用一些现有的库解析HTML,提取所有href,转换为文件路径,并用System.IO.File.Exists检查文件的存在。

我的猜测是,这是一个由您控制的项目。在这种情况下,你发现的任何错误都是你计划修复或让别人修复的。此外,如果你想在文件中爬行,并且觉得这会给你带来一些好处,那么这就是全部或大部分静态HTML。如果所有这些假设都是真的,冒着引起其他问题中那些说你不能用Regex"解析html"的人愤怒的风险,我确实建议使用Regex。IMHO,您正在查找href="url"或src="url"。这不应该特别容易出错。你可能会错过一些东西,但你不需要解析整个HTMLDOM来找到这两个相对简单的模式。

话虽如此,如果我这样做的话,我会循环通过Regex.Matches,然后使用Path.Combine将相对路径与根文件夹合并,并使用File.Exists,就像Sebastian建议的那样。对于外部的绝对URL,我会使用HttpWebRequest。此外,我会将所有请求排队,并使获取响应异步。

使用HTMLAgilityPack:

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
    }
}

上面的大部分代码都来自他们自己的示例页面。

您可能需要对href属性进行一些额外的工作。