winforms 如何使用HtmlAgilityPack在网站上抓取表格?

nwlls2ji  于 2022-11-30  发布在  其他
关注(0)|答案(1)|浏览(142)

我需要用C#从一个网站上抓取一个表,并将数据导出到pgadmin中作为数据库,以存储数据供以后使用。我尝试过使用不同的方法,我在互联网上看到过,“await”方法似乎是最好的方法。我还没有找到任何使用它的例子,因此下面的代码是我想出的。(我在visual studio中使用windows窗体)

string url = ("internet website here");

                        WebClient webclient = new WebClient();
                        string page = webclient.DownloadString(url);

                        HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
                        doc.LoadHtml(page);

                        List<List<string>> table = doc.DocumentNode.SelectNodes("//*[@id=\"cr_cashflow\"]/div[2]/div/table")
                            .Descendants("tr")
                            .Where(tr=>tr.Elements("td").Count() > 0)
                            .Select(tr => tr.Elements("td").Select(td => td.InnerText.Trim()).ToList())
                            .ToList();dataGridTable1.Datasource=table

下面是我想写的:

<table class='cr_dataTable>
 <tbody>
   <tr classs>
       <td class>Values</td>
       <td class>1,356</td>
       <td class>1,256</td>
       <td class>1,459</td>
       <td class>1,535</td>

我所拥有的是复制表“cr_dataTable”的xpath。
现在来看看这个问题,由于我是编程领域的新手,我还在学习这个方法是如何工作的,代码告诉我:
“系统.空引用异常:'未将对象引用设置为对象的示例。' HtmlAgilityPack.HtmlNode.SelectNodes(...)返回空值。”
我应该如何考虑使用这个方法来查找“cr_dataTable”的值而不返回空值消息呢?在这一点上,我不知道我错过了什么,代码工作。感谢有人知道这是错误的代码,并如何使它工作。

vpfxa7rd

vpfxa7rd1#

你可以参考下面的代码。由于我无法得到你的目标网站和网站的html代码,目标网址和xpath需要自己编辑。代码如下:

HtmlWeb web = new HtmlWeb();
HtmlAgilityPack.HtmlDocument doc = web.Load (@"http://data.com");         //your target site
doc.LoadHtml(doc.DocumentNode.SelectSingleNode("/html[1]/body[1]/div[1]/div[5]/div[1]/div[2]/div[1]/div[2]/div[1]/table[1]").InnerHtml);  //Customize according to your landing page html layout
 
HtmlNodeCollection nodeHeaders = doc.DocumentNode.SelectNodes("./tr[1]/th");  //get title
 
HtmlNodeCollection nodeValues = doc.DocumentNode.SelectNodes("./tr[2]/td");   //Only get the value of the first row
 
for (int i = 0; i < nodeHeaders.Count; i++)  //save data
{
    Console.WriteLine("Header: {0}, Value: {1}", nodeHeaders[i].InnerText, nodeValues[i].InnerText);
}
 
doc = null;
web = null;

相关问题