20-01-14, 01:25 AM
(آخر تعديل لهذه المشاركة : 28-01-14, 08:34 AM {2} بواسطة الشاكي لله.)
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
[سلسلة ادوات المبرمج] {2} - اداة تحليل صفحات الويب HAPXPathFinder
السلام عليكم ورحمة الله وبركاته
[سلسلة ادوات المبرمج] {2} - اداة تحليل صفحات الويب HAPXPathFinder
--
ماهي اداة HAPXPathFinder
هي اداة تستخدم مع مكتبة htmlagilitypack المختصة بتحليل صفحات الويب .
المقصود بتحليل صفحات الويب هو استخراج البيانات منها ، فلو طلبت منك ان تقوم باستخراج بيانات هذا الجدول ووضعها في List view على برنامجك :
كيف ستسخرجها وتضعها في ListView كما فعلت انا ؟
بعضكم استعمل التعابير القياسية Regex ، مثل احد الاخوان في المنتدى .. وانا نصحته عدة مرات ان استعمال التعابير القياسية غير عملي ابدا في تحليل الصفحات بوجود المكتبة العملاقة htmlagilitypack ..
كود البرنامج الي فوق :
PHP كود :
private void button1_Click(object sender, EventArgs e)
{
listView1.Items.Clear();
listView2.Items.Clear();
string carrier = "";
if (comboBox1.Text.ToLower().Equals("egyptair")){carrier = "MS";}
string URL = string.Format("http://www.cargoserv.com/trace/trace.asp?Carrier={0}&Shipment_text={1}-{2}&Header=no&Site=Cserv",
new string[] { carrier, textBox1.Text.Trim(), textBox2.Text.Trim() });
HtmlWeb hWeb = new HtmlWeb();
HtmlAgilityPack.HtmlDocument doc = hWeb.Load(URL);
AddHistoryTableToListview(doc);
AddStatusTableToListview(doc);
}
void AddHistoryTableToListview(HtmlAgilityPack.HtmlDocument document)
{
HtmlNode historyTable = document.DocumentNode.SelectSingleNode
("/html[1]/body[1]/table[1]/tr[1]/table[2]/table[2]/tr[1]");
ListViewItem listItem = new ListViewItem();
listItem.Text = historyTable.ChildNodes[1].ChildNodes[0].InnerText.Trim();
listItem.SubItems.Add(historyTable.ChildNodes[3].ChildNodes[0].InnerText.Trim());
listItem.SubItems.Add(historyTable.ChildNodes[5].ChildNodes[0].InnerText.Trim());
listItem.SubItems.Add(historyTable.ChildNodes[7].ChildNodes[0].InnerText.Trim());
listItem.SubItems.Add(historyTable.ChildNodes[9].ChildNodes[0].InnerText.Trim());
listItem.SubItems.Add(historyTable.ChildNodes[11].ChildNodes[0].InnerText.Trim());
listView1.Items.Add(listItem);
}
private void AddStatusTableToListview(HtmlAgilityPack.HtmlDocument document)
{
HtmlNode dataTable = document.DocumentNode.SelectSingleNode
("/html[1]/body[1]/table[1]/tr[1]/table[2]/table[4]");
foreach (HtmlAgilityPack.HtmlNode node in dataTable.SelectNodes("./tr"))
{
ListViewItem listItem = new ListViewItem();
listItem.Text = node.ChildNodes[1].ChildNodes[0].InnerText.Trim();
listItem.SubItems.Add(node.ChildNodes[3].ChildNodes[0].InnerText.Trim());
listView2.Items.Add(listItem);
}
}
الان اتحدى اي شخص يحلل الجدول ويستخرج البيانات بهذه السطور البسيطة بواسطة Regas >> مستحيل
استعمال الregas بيجعل الكود اكثر تعقيدا واصعب للتنقيح والفرق بين السماء والارض بينها وبين htmlagilitypack من ناحية السهولة والدقة .
التحليل له مقالة خاصة في المنتدى القديم (ارجو متابعتها اولا قبل اكمال بقية هذا الموضوع
شرح اداة HAPXPathFinder
في المقالة السابقة كنت استخدم طريقة بدائية للتحليل وهي بالتتبع في متصفح الFirefox وهذا الامر غير دقيق قأتذكر الاخ klsawy الله يذكره بالخير واجه مشكلة في الحصول على xpath لبعض العناصر
السبب هو ان DOM الFirefox مختلف عن Dom مكتبة HtmlAgilityPack وبالتالي ترتيب العناصر مختلف عن اداة HtmlAgilityPack حتى اني ضننت ان هناك مشكلة في نفس المكتبة
ولكن تبين لي انها احترافية اكثر ممااضن . ولحسن الحظ وجدت برنامج اسمه HAPXPathFinder وهو يستخدم بشكل خاااص للHtmlAgilityPack وهو رائع جدااا
يعني مشاكل الxpath والelement كلها انسااهاا مع هذه الاداة .
وقد عملت شرح فيديو طلبه احد الاعضاء وانا اقوم بتنفيذ (سحب بيانات من جداول صفحة الويب ووضعها في ListView)
الشرح مدته 29 دقيقة بالصوت والصورة بجودة عالية (مشاهدة ممتعة)
او على اليوتيوب :-
إقتباس :http://www.youtube.com/watch?v=vNRhfXALu5g
--
تحميل الاداة :
إقتباس :http://hapxpathfinder.codeplex.com/downloads/get/597452
تحياتي