我正在通过创建一个小程序来学习C#,并且找不到类似的帖子(如果这个答案在其他地方发布,则道歉)。
我怎样才能在屏幕上抓取PDF链接(我可以将其下载到指定位置)?有时页面会链接到另一个具有实际PDF链接的HTML页面,因此如果在第一页上找不到实际的PDF,我希望它能自动查找包含“PDF”的链接。链接的文本,然后搜索生成的PDF链接的结果HTML页面。
我知道我可能通过谷歌搜索文件类型来实现类似的东西,但这似乎是“欺骗”我:)我宁愿学习如何在代码中做到这一点,但我不知道从哪里开始。我对使用XElement等进行XML解析有点熟悉,但是我不知道如何从HTML页面(或其他格式?)获取链接。
有人能指出我正确的方向吗?谢谢!
答案 0 :(得分:2)
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的角度来看可能无效的东西(未封闭的标签,缺少引号等)。
答案 1 :(得分:0)
您最好的选择可能是使用HTML Agility屏幕抓取页面,然后选择href属性以查看它是否看起来像PDF下载。如果没有,您可以在节点内查看PDF等关键字的文本,以决定是否关注该链接。
答案 2 :(得分:0)
要解析任何HTML页面,请使用HtmlAgilityPack。它是最好的。
从中您可以将任何HTMl页面转换为XML,您可以比HTML更轻松地进行搜索。
如果您需要抓取网站以获取信息,请查看NCrawler。