屏幕抓取PDF链接下载

时间:2011-03-11 22:58:36

标签: c# pdf screen-scraping html-parsing html-content-extraction

我正在通过创建一个小程序来学习C#,并且找不到类似的帖子(如果这个答案在其他地方发布,则道歉)。

我怎样才能在屏幕上抓取PDF链接(我可以将其下载到指定位置)?有时页面会链接到另一个具有实际PDF链接的HTML页面,因此如果在第一页上找不到实际的PDF,我希望它能自动查找包含“PDF”的链接。链接的文本,然后搜索生成的PDF链接的结果HTML页面。

我知道我可能通过谷歌搜索文件类型来实现类似的东西,但这似乎是“欺骗”我:)我宁愿学习如何在代码中做到这一点,但我不知道从哪里开始。我对使用XElement等进行XML解析有点熟悉,但是我不知道如何从HTML页面(或其他格式?)获取链接。

有人能指出我正确的方向吗?谢谢!

3 个答案:

答案 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