1

我正在通过创建一个小程序学习C#,并找不到类似的帖子(如果此答案发布在其他地方,道歉)。屏幕抓取PDF链接下载

如何可能我去屏幕抓取的链接,PDF文件(我可以再下载到指定位置)一个网站吗?有时候,一个页面会链接到另一个具有实际PDF链接的HTML页面,因此如果在第一页上找不到真正的PDF,我希望它自动查找链接中包含“PDF”的链接链接的文本,然后在真正的PDF链接中搜索生成的HTML页面。

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

任何人都可以指向正确的方向吗?谢谢!

回答

1

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点(未闭合的标签,缺失报价等)无效。

+0

谢谢!这真的有帮助。 – superwillis 2011-03-14 05:52:19

+0

这里的变量pdfUrls是什么类型的?我如何循环访问pdfUrls中包含的每个链接?仍然像数组一样访问pdfUrls [0],pdfUrls [1]? – devcoder 2013-09-30 00:25:03

+0

@Maxim Gueivandov我将搜索路径更改为字符串pdfLinksUrl =“http://www.google.com/search?q=cloud+computing+filetype%3Apdf”;并没有得到任何结果 – Narasappa 2016-04-25 11:21:17

0

您最好的选择可能是使用HTML Agility到屏幕刮的页面,然后选择href属性,看看它看起来像一个PDF下载。如果没有,您可以查看节点中的关键字(如PDF)中的文本,以决定是否遵循链接。

+1

如果你是一个jQuery的球迷,你可能也喜欢fizzler - http://code.google.com/p/fizzler/ – 2011-03-11 23:16:35

0

对于任何HTML页面的解析,使用HtmlAgilityPack。这是最好的。

从那你可以将任何HTMl页面转换成XML,你可以比HTML更容易搜索。

如果您需要抓取的信息的网站,看看NCrawler

+0

我会看看NCrawler为好,谢谢。如果解决问题,我会在这里回复。 – superwillis 2011-03-14 19:16:38