1

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

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

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

谁能指出我正确的方向?谢谢!

4

3 回答 3

4

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 的角度来看可能是无效的内容(未闭合的标签、缺少引号等)。

于 2011-03-11T23:17:14.197 回答
0

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

于 2011-03-11T23:15:19.613 回答
0

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

从此,您可以将任何 HTMl 页面转换为 XML,您可以比 HTML 更容易地进行搜索。

如果您需要爬取站点以获取信息,请查看NCrawler

于 2011-03-11T23:15:40.223 回答