为什么我的Foreach只输出第一位数据?

问题描述 投票:1回答:2

一般来说,机器人和C#都是合理的新手。我正在尝试输出匹配//a[@class='featuredBox的内部文本的所有链接,但它只输出第一位数据。

事实上,当我进行调试时,它确实附加了大量的值,所以我很困惑为什么不输出它们呢?

    protected void Page_Load(object sender, EventArgs e)
{
    HtmlAgilityPack.HtmlWeb web = new HtmlAgilityPack.HtmlWeb();
    HtmlAgilityPack.HtmlDocument doc = web.Load("https://www.jasminedirectory.com/computers/companies/");

    var headingNames = doc.DocumentNode.SelectNodes("//a[@class='featuredBox']").ToList();

    foreach (var item in headingNames)
    {
        botOutput.Text = item.InnerText + "</br>";
    }
}

任何帮助,将不胜感激。

c# web-scraping foreach
2个回答
3
投票

尝试在+之前添加=。目前看起来你只是在每个循环上覆盖Text属性,听起来你想要追加每个匹配。

protected void Page_Load(object sender, EventArgs e)
{
  HtmlAgilityPack.HtmlWeb web = new HtmlAgilityPack.HtmlWeb();
  HtmlAgilityPack.HtmlDocument doc = web.Load("https://www.jasminedirectory.com/computers/companies/");

  var headingNames = doc.DocumentNode.SelectNodes("//a[@class='featuredBox']").ToList();

  foreach (var item in headingNames)
  {
    botOutput.Text += item.InnerText + "</br>";
  }
}

替代方法:

protected void Page_Load(object sender, EventArgs e)
{
  HtmlAgilityPack.HtmlWeb web = new HtmlAgilityPack.HtmlWeb();
  HtmlAgilityPack.HtmlDocument doc = web.Load("https://www.jasminedirectory.com/computers/companies/");

  var headingNames = doc.DocumentNode.SelectNodes("//a[@class='featuredBox']").ToList();
  botOutput = headingNames.Select(name => name.InnerText).Aggregate((current, next) => $"{current}</br>{next}") + "</br>";
}

2
投票

你不断更换(而不是追加)。改为:

foreach (var item in headingNames)
{
    botOutput.Text += item.InnerText + "</br>";
}

可能值得注意的是,如果headingNames很大,你应该使用StringBuilder或者你产生不必要的GC压力,因为string是不可变的。

© www.soinside.com 2019 - 2024. All rights reserved.