从抓取的链接下载所有 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 链接。我建议使用调试器
- 检查您是否可以在浏览器中访问该站点。
- 如果您可以访问该站点,请使用 Debugger 查看您拥有的 InnerHtml
htmlDoc.DocumentNode
- 如果你得到数据,把它复制到记事本,看看标签是否在那里。你应该有一个完整的 HTML 文档。
- 对于代理服务器,将信息添加到加载调用中。
经过大约 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>
请为此给出原始答案!
虽然 运行 代码表示 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 链接。我建议使用调试器
- 检查您是否可以在浏览器中访问该站点。
- 如果您可以访问该站点,请使用 Debugger 查看您拥有的 InnerHtml
htmlDoc.DocumentNode
- 如果你得到数据,把它复制到记事本,看看标签是否在那里。你应该有一个完整的 HTML 文档。
- 对于代理服务器,将信息添加到加载调用中。
经过大约 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>
请为此给出原始答案!