【问题标题】:No results with C# web scrapingC# web 抓取没有结果
【发布时间】:2021-05-19 11:30:11
【问题描述】:

我是一个初学者,我想尝试使用 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();
    }

【问题讨论】:

  • 您的Main 方法没有等待对GetHtmlAsync 的异步调用,因此在执行任何操作之前退出程序。您还需要将Main 方法设为async 并等待对GetHtmlAsync 的调用。
  • 不要忽略编译器警告。编译器警告的意思是“这段代码会编译,但不会像你想象的那样做”,这正是这里发生的事情。

标签: c# html .net web-scraping


【解决方案1】:

当您在 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);
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    相关资源
    最近更新 更多