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

时间:2019-03-14 18:56:31

标签: c# web-scraping foreach

对于机器人和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>";
    }
}

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分: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>";
}

答案 1 :(得分:2)

您正在不断替换(而不是追加)。改为这样做:

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

如果headingNames较大,则应该使用StringBuilder,否则会产生不必要的GC压力,因为string是不可变的。