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