HTML Agility Pack foreach 循环不迭代数据网格 (C#)

HTML Agility Pack foreach loop not iterating for data grid (C#)

我是一名初级程序员,正在使用 C# 开发一个小型网络爬虫。目的是获取医院的 public 网站,获取每位医生的数据、他们的部门、phone 和文凭信息,并将其显示在数据网格视图中。这是一个 public 网站,据我所知,该网站的 robots.txt 允许这样做,所以我将代码中的所有内容保持原样。

我可以分别抓取每个数据(姓名、部门、​​phone、文凭),并能成功地在文本框中显示它们。

// THIS WORKS:
            string text = "";
            foreach (var nodes in full)
            {
                text += nodes.InnerText + "\r\n";
            }
            textBox1.Text = text;

但是,当我尝试使用 class 将数据传递到数据网格视图时,foreach 循环仅遍历名字并用它填充数据网格。

foreach (var nodes in full)
            {
                var Doctor = new Doctor
                {
                    Col1 = full[0].InnerText,
                    Col2 = full[1].InnerText,
                    Col3 = full[2].InnerText,
                    Col4 = full[3].InnerText,
                };
                Doctors.Add(Doctor);
            }

我花了好几个小时寻找解决方案,但 none 我发现的解决方案一直有效,我现在无法决定是否搞砸了 foreach 循环不知何故,或者如果我没有按照 HTML Agility Pack 的规则做某事。它让我遍历文本框,而不是 foreach。将 full[0] 更改为 nodes[0]nodes.InnerText 似乎也没有解决它。

link 到 public 要点文件(您可以在其中看到我的全部代码)

screenshot

提前感谢您的帮助!

问题在于您如何 select 从页面获取节点。 full平面列表中包含所有个人姓名、部门等,这意味着full[0]是第一个医生的名字,而full[4]是第一个医生的名字下一个的名字。你的 for-loop 没有考虑到这一点,因为你(对于每个节点)总是访问 full[0]full[3] - 所以,只有第一位医生的属性。

为了使您的代码更具可读性,我将其拆分一下,首先为每个医生列出所有 card-elements,然后 select 循环中的各个部分:

HtmlWeb web = new HtmlWeb();

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc = web.Load("https://klinikaikozpont.unideb.hu/doctor_finder");

const string doctorListItem = "div[contains(@class, 'doctor-list-item-model')]";
const string cardContent = "div[contains(@class, 'card-content')]";
var doctorCards = doc.DocumentNode.SelectNodes($"//{doctorListItem}/{cardContent}");

var doctors = new List<Doctor>();
foreach (var card in doctorCards)
{
    var name = card.SelectSingleNode("./h3")?.InnerText;
    const string departmentNode = "div[contains(@class, 'department-name')]";
    var department = card.SelectSingleNode($"./{departmentNode}/p")?.InnerText;
    // other proprties...

    doctors.Add(new Doctor{NameAndTitle = name, Department = department});
}

// I took the liberty to make this class easier to understand
public class Doctor
{
    public string NameAndTitle { get; set; }
    public string Department { get; set; }
    // Add other properties
}

查看 the code in action