C# 网页抓取没有结果

时间:2021-02-16 15:29:15

标签: c# html .net web-scraping

我是初学者,我想尝试使用 C# 进行一些网页抓取,但是使用此代码,它不会返回任何结果,即使它应该返回完整的项目列表。

static void Main(string[] args)
    {
        GetHtmlAsync();
        Console.ReadLine();
    }
    private static async void GetHtmlAsync()
    {
        var url = "https://www.ebay.com/sch/i.html?_from=R40&_trksid=p2380057.m570.l1313&_nkw=playstation+5&_sacat=0";

        var httpClient = new HttpClient();
        var html = await httpClient.GetStringAsync(url);

        var htmlDocument = new HtmlDocument();
        htmlDocument.LoadHtml(html);

        var ProductList = htmlDocument.DocumentNode.Descendants("ul").Where(node => node.GetAttributeValue("class", "").Equals("ListViewInner")).ToList();
    }

1 个答案:

答案 0 :(得分:0)

当您在 C# 中使用 async 时,您需要一直向下(和向上)异步。

因此,要调用 async void GetHtmlAsync() 方法,您的调用者必须是异步的。

对于异步方法,它不能返回 void,而是我们返回一个 Task。任务基本上代表了“返回值的潜力”,并且无论是否达到潜力都可以传递,因此您可以拥有一个Task<int>,它会在某些时候为您提供一个数字,如果你等待它这样做。

如果您想在读取行之前获得结果,您还需要await结果。

    static async Task Main(string[] args)
    {
        await GetHtmlAsync();
        Console.ReadLine();
    }

完整示例

我不知道您使用的是 HtmLDocument 的哪个实现,因此下面有一个 using 语句需要替换 (using SOURCE.OF.HTMLDOCUMENT;)。

using System;
using System.Net.Http;
using System.Threading.Tasks;
using SOURCE.OF.HTMLDOCUMENT;

namespace ConsoleApp1
{
    class Program
    {
        static async Task Main(string[] args)
        {
            await GetHtmlAsync();
            Console.ReadLine();
        }

        private static async Task GetHtmlAsync()
        {
            var url = "https://www.ebay.com/sch/i.html?_from=R40&_trksid=p2380057.m570.l1313&_nkw=playstation+5&_sacat=0";

            var httpClient = new HttpClient();
            var html = await httpClient.GetStringAsync(url);

            var htmlDocument = new HtmlDocument();
            htmlDocument.LoadHtml(html);

            var ProductList = htmlDocument.DocumentNode.Descendants("ul").Where(node => node.GetAttributeValue("class", "").Equals("ListViewInner")).ToList();

            Console.WriteLine(ProductList.Count);
        }
    }
}