我正在使用c#开发Web刮板控制台应用程序,似乎在使用同一对象而不是创建新对象的情况下在页面上获取某些文本时遇到问题。
所以我现在的操作方式如下:
public static async void GetPosts()
{
var siteUrl = "https://news.ycombinator.com/";
HttpClient httpClient = new HttpClient();
var data = await httpClient.GetStringAsync(siteUrl);
var htmlDocument = new HtmlDocument();
htmlDocument.LoadHtml(data);
var postsHTML = htmlDocument.DocumentNode.Descendants("table")
.Where(node => node.GetAttributeValue("class", "")
.Equals("itemlist")).ToList();
var postList = postsHTML[0].Descendants("tr")
.Where(node => node.GetAttributeValue("class", "")
.Equals("athing")).ToList( );
//var postSubText = postsHTML[0].Descendants("td")
//.Where(node => node.GetAttributeValue("class", "")
//.Equals("subtext")).ToList();
foreach (var post in postList)
{
var storylink = post.Descendants("a")
.Where(node => node.GetAttributeValue("class", "")
.Equals("storylink")).FirstOrDefault();
Console.WriteLine("Title: " + storylink.InnerText);
Console.WriteLine("URI: " + storylink.GetAttributeValue("href", ""));
// var subtext = post.Descendants("td")
// .Where(node => node.GetAttributeValue("class", "")
// .Equals("hnuser ")).FirstOrDefault();
// Console.WriteLine("Author: " + subtext.InnerText);
Console.WriteLine();
}
}
}
}
//foreach (var subText in postSubText)
//{
//Console.WriteLine("Author: " + subText.Descendants("a")
// .Where(node => node.GetAttributeValue("class", "")
// .Equals("hnuser")).FirstOrDefault().InnerText);
// Console.WriteLine();
//}
现在,如果您查看理想地从该链接引入所有帖子的帖子列表对象。现在由于某种原因,无法访问同一对象下的作者,评论等。我必须为要检索的其他文本项创建数组的新对象,因此必须为每个循环创建另一个。有没有办法可以在一个循环中完成?起初,我想到将两个数组合并在一起,但是由于某种原因,这似乎不起作用。当我将对象用于在每个循环中创建的子测试时,我没有找回作者,而得到了空值。