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

时间:2014-11-13 19:08:59

标签: c# html optimization

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

3 个答案:

答案 0 :(得分:1)

不要轻易说,这容易出错。不要打开网页浏览器,这很糟糕,而且很慢。

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

答案 1 :(得分:1)

我的猜测是这个项目有点在你的控制之下。在这种情况下,您发现计划修复或修复某些错误。此外,如果您希望抓取文件并觉得可以为您带来一些好处,那么这就是全部或大多数是静态HTML。如果所有这些假设都是正确的话,冒着引起其他问题的人的愤怒的风险,他们说你不能用正则表达式“解析HTML”,我实际上建议使用正则表达式。恕我直言,你正在寻找href =“url”或src =“url”。这不应该特别容易出错。你有可能错过一些东西,但你不需要解析整个HTML DOM只是为了找到那两个相对简单的模式。

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

答案 2 :(得分:1)

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

上面代码的大部分内容来自their own example page

您可能需要对href attr。

进行一些额外的工作
相关问题