从抓取的链接下载所有 PDF 文件

Download all PDF files from crawled links

虽然 运行 代码表示 ProductListPage 为空,并且在删除错误后不会继续前进。

有什么解决这个问题的想法吗?等到找到 //div[@class='productContain padb6']//div[@class='large-4 medium-4 columns']/a 或其他什么?

这是我当前的代码:

HtmlDocument htmlDoc = new HtmlWeb().Load("https://example.com/");
HtmlNodeCollection ProductListPage = htmlDoc.DocumentNode.SelectNodes("//div[@class='productContain padb6']//div[@class='large-4 medium-4 columns']/a");
foreach (HtmlNode src in ProductListPage)
{
    htmlDoc = new HtmlWeb().Load(src.Attributes["href"].Value);

    HtmlNodeCollection LinkTester = htmlDoc.DocumentNode.SelectNodes("//div[@class='row padt6 padb4']//a");
    if (LinkTester != null)
    {
        foreach (var dllink in LinkTester)
        {
            string LinkURL = dllink.Attributes["href"].Value;
            Console.WriteLine(LinkURL);

            string ExtractFilename = LinkURL.Substring(LinkURL.LastIndexOf("/"));
            var DLClient = new WebClient();

            DLClient.DownloadFileAsync(new Uri(LinkURL), @"C:\temp\" + ExtractFilename);
        }
    }
}

编辑:

代码似乎可以在没有 VPN 连接的情况下工作,但它不适用于 VPN。我有使用 Python 和 BeautifulSoup 的替代方案,无论 VPN 连接如何,它都能正常工作。知道为什么 C# 和 htmlAgilityPack 不能解决问题吗?


编辑2:

我注意到 VPN 连接页面加载时有轻微延迟。第一页正在加载,然后是内容。

确保您可以访问该站点(防火墙或其他应用可能不允许访问)。

当我 运行 您的代码(包括 Visual Basic 和 .Net)时,我可以访问子站点甚至查找 Pdf 链接。我建议使用调试器

  1. 检查您是否可以在浏览器中访问该站点。
  2. 如果您可以访问该站点,请使用 Debugger 查看您拥有的 InnerHtml htmlDoc.DocumentNode
  3. 如果你得到数据,把它复制到记事本,看看标签是否在那里。你应该有一个完整的 HTML 文档。
  4. 对于代理服务器,将信息添加到加载调用中。

经过大约 2 个月的搜索和阅读,终于找到了解决方案。将此添加到 app.config 对我有用,无需任何代码更改:

<system.net>
   <defaultProxy useDefaultCredentials="true" />
</system.net>

所以我的 app.config 现在看起来像这样:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
    </startup>
  <system.net>
    <defaultProxy useDefaultCredentials="true" />
  </system.net>
</configuration>

请为此给出原始答案!