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 要点文件(您可以在其中看到我的全部代码)
提前感谢您的帮助!
问题在于您如何 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
}
我是一名初级程序员,正在使用 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 要点文件(您可以在其中看到我的全部代码)
提前感谢您的帮助!
问题在于您如何 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
}