【问题标题】:Screen-scraping for PDF links to download用于下载 PDF 链接的屏幕抓取
【发布时间】:2011-07-13 20:25:05
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案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 的角度来看可能是无效的东西(未闭合的标签、缺少引号等)。

    【讨论】:

    • 这里的变量pdfUrls的类型是什么?如何遍历 pdfUrls 中包含的每个链接?是否仍然像数组 pdfUrls[0]、pdfUrls[1] 一样被访问?
    • @Maxim Gueivandov 我将搜索路径更改为字符串 pdfLinksUrl = "google.com/search?q=cloud+computing+filetype%3Apdf";没有结果
    【解决方案2】:

    您最好的选择可能是使用HTML Agility 对页面进行屏幕抓取,然后选择 href 属性以查看它是否看起来像 PDF 下载。如果没有,您可以查看节点内的文本以查找 PDF 等关键字,以决定是否跟随链接。

    【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 我也会看看 NCrawler,谢谢。如果成功了,我会在这里发帖。
    猜你喜欢
    • 1970-01-01
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    相关资源
    最近更新 更多