我是一名初學者程式員,在 C# 中使用小型 webscraper 作業。目的是獲取醫院的公共網站,獲取每位醫生、他們的科室、電話和文憑資訊的資料,并將其顯示在資料網格視圖中。這是一個公共網站,據我所知,該網站的 robots.txt 允許這樣做,所以我將代碼中的所有內容保持原樣。
我能夠分別獲取每個資料(姓名、部門、??電話、文憑),并且可以成功地將它們顯示在文本框中。
// THIS WORKS:
string text = "";
foreach (var nodes in full)
{
text = nodes.InnerText "\r\n";
}
textBox1.Text = text;
但是,當我嘗試使用類將資料傳遞到資料網格視圖時,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);
}
我花了好幾個小時尋找解決方案,但我發現沒有一個有效,而且我無法決定是否以某種方式搞砸了 foreach 回圈,或者我沒有做根據 HTML Agility Pack 的規則的東西。它讓我可以遍歷文本框,但不能遍歷 foreach。更改full[0]為nodes[0]或nodes.InnerText似乎也沒有解決它。
鏈接到公共 gist 檔案(您可以在其中看到我的整個代碼)
截屏
提前感謝您的幫助!
uj5u.com熱心網友回復:
問題是您如何從頁面中選擇節點。在一個平面串列full中包含所有個人姓名、部門等,這意味著是第一個醫生的名字,而是下一個醫生的名字。您的 for 回圈沒有考慮到這一點,因為您(對于每個節點)總是可以訪問-所以,只有第一個醫生的屬性。full[0]full[4]full[0]full[3]
為了使您的代碼更具可讀性,我將其拆分一下,首先列出每個醫生的所有卡片元素,然后在回圈中選擇各個部分:
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
}
查看實際代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/442697.html
上一篇:熊貓資料框到excel
下一篇:將沒有表格的刮取資料保存到熊貓中
