【发布时间】:2019-12-27 09:02:52
【问题描述】:
我有一个代码用于抓取网页上的所有 PDF 文件并将它们下载到文件夹中。但是现在它开始出现错误:
System.NullReferenceException HResult=0x80004003 消息=对象 引用未设置为对象的实例。来源=NW 爬虫
StackTrace:在 NW_Crawler.Program.Main(String[] args) 中 C:\Users\PC\source\repos\NW Crawler\NW Crawler\Program.cs:line 16
在foreach (HtmlNode src in ProductListPage) 中指向ProductListPage
有关于如何解决此问题的任何提示吗?我试图实现异步/等待但没有成功。也许我做错了什么......
这是要完成的过程:
- 转到
https://www.nordicwater.com/products/waste-water/ - 列出部分(相关产品)中的所有链接。他们是:
<a class="ap-area-link" href="https://www.nordicwater.com/product/mrs-meva-multi-rake-screen/">MRS MEVA multi rake screen</a> -
转到每个链接并搜索 PDF 文件。 PDF 文件位于:
<div class="dl-items"> <a href="https://www.nordicwater.com/wp-content/uploads/2016/04/S1126-MRS-brochure-EN.pdf" download="">
这是我的完整测试代码:
using HtmlAgilityPack;
using System;
using System.Net;
namespace NW_Crawler
{
class Program
{
static void Main(string[] args)
{
{
HtmlDocument htmlDoc = new HtmlWeb().Load("https://www.nordicwater.com/products/waste-water/");
HtmlNodeCollection ProductListPage = htmlDoc.DocumentNode.SelectNodes("//a[@class='ap-area-link']//a");
Console.WriteLine("Here are the links:" + ProductListPage);
foreach (HtmlNode src in ProductListPage)
{
htmlDoc = new HtmlWeb().Load(src.Attributes["href"].Value);
// Thread.Sleep(5000); // wait some time
HtmlNodeCollection LinkTester = htmlDoc.DocumentNode.SelectNodes("//div[@class='dl-items']//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();
// Thread.Sleep(5000); // wait some time
DLClient.DownloadFileAsync(new Uri(LinkURL), @"C:\temp\" + ExtractFilename);
}
}
}
}
}
}
}
【问题讨论】:
-
你检查过ProductListPage是否不为空吗?
-
您的意思是添加
Console.WriteLine("Here are the links:" + ProductListPage);? Yes 看起来像 null,但为什么呢? -
试试这个 xpath:
//a[@class='ap-area-link']在您共享的链接中,您没有另一个嵌套锚点。
标签: c# web-scraping web-crawler html-agility-pack