HtmlAgilityPack非常适合这种东西。
实施示例:
string pdfLinksUrl = "http://www.google.com/search?q=filetype%3Apdf";
// Load HTML content
var webGet = new HtmlAgilityPack.HtmlWeb();
var doc = webGet.Load(pdfLinksUrl);
// select all <A> nodes from the document using XPath
// (unfortunately we can't select attribute nodes directly as
// it is not yet supported by HAP)
var linkNodes = doc.DocumentNode.SelectNodes("//a[@href]");
// select all href attribute values ending with '.pdf' (case-insensitive)
var pdfUrls = from linkNode in linkNodes
let href = linkNode.Attributes["href"].Value
where href.ToLower().EndsWith(".pdf")
select href;
// write all PDF links to file
System.IO.File.WriteAllLines(@"c:\pdflinks.txt", pdfUrls.ToArray());
附带说明一下,我不会过多地依赖 HAP 中的 XPath 表达式。缺少一些 XPath 函数,将所有提取逻辑放在 XPath 中会降低代码的可维护性。我将使用 XPath 表达式提取一个合理的最小值,然后通过遍历节点集合来执行所有必需的提取(Linq 方法有很大帮助)。
HAP 的真正强大之处在于解析 SGML 文档的能力,即从 XHTML 的角度来看可能是无效的内容(未闭合的标签、缺少引号等)。