boty كتب :اخي انا اريد ان اتعلم كيفية تنفيذ البرنامج حتى استفيد فانا تحت التعليم
لكن اذا كنت تريد تنفيذ التطبيق
فانا اريد سعرة بالجنيه ، و العيار 21 على سبيل المثال
امثالك يعجبوني
لايريدون الكود جاهزا بل يريدون الكيفية كي يستفيدون
لذلك ساشرح لك بالتفصيل
--
اولا العملية التي سنقوم باستعمالها تسمى html parsing
وتعني تحليل صفحة الويب واستخراج المطلوب
هناك اكثر من طريقة لعمل هذا التحليل مثل استخدام مكتبة متخصصة في ذلك اسمها htmlagilitypack وهي مجانية وطبعا هي افضل طريقة للتحليل
يمكنك استعمال اداة الويب براوزر لجلب مستند الصفحة وتحليله لكن هذا ليس مفيدا ابدا لأنها ستقوم بتحميل الصور وكل شيئ في الصفحة وهذا يأخذ وقتا بالاضافة الى استهلاك مساحة اكبر من الرام وجلب اشياء لانريدها كا الكوكيز والجيتش كل هذا لسنا بحاجة اليه مما يجعل اداة الويب براوزر اداة فاشلة للparsing html وهناك البديل
--
الان ماذا تريد ان نستخرج من الصفحة
تريد ان نستخرج نصا صحيح , لذلك افتح قوقل كروم او الفايرفوكس واذهب للنص الذي تريد استخراجه
وقم بتحديده واضغط زر يمين على النص واختار اخر خيار
ظهرت لما قائمة جديدة في الاسفل وهي قائمة عناصر الصفحة (elements)
وتم تحديد العنصر الحالي (262.91)
ماذا الان ؟؟
احتفظ بهذه الصورة لأننا سنرجع لها لاحقا
--
الان قم بتنزيل مكتبة Html Agility Pack من المرفقات
لنقم بالبرمجة
1- نضيف زر نسميه Get gold price
2- نضيف ليبل
3- نضيف مرجع عبر الذهاب الى project في الاعلى ثم add refreance ثم browse ثم اختر ملف HtmlAgilityPack.dll المرفق في الحزمة rar
خلاص الان ندخل على حدث button1-click ونقوم بكتابة الاتي
PHP كود :
Dim hweb As New HtmlAgilityPack.HtmlWeb()
Dim doc As HtmlAgilityPack.HtmlDocument = hweb.Load("http://egypt.gold-price-today.com/")
For Each node As HtmlAgilityPack.HtmlNode In doc.DocumentNode.SelectNodes("//tr")
Try
If node.SelectNodes(".//th")(0).InnerText = "سعر الذهب عيار 21" Then
label1.Text = node.SelectNodes(".//td")(0).InnerText
End If
Catch
End Try
Next
نقوم بشرح الاكواد
1. قمنا بتعريف كائن hweb
2. قمنا بتحميل سورس الصفحة ونسخها الى كائن اخر هو htmlDocument - العملية تاخذ 3 ثواني فقط بعكس اداة webbrowser
3. قمنا بالدوران على كل العناصر الي الtag تبعها tr
ماهي العناصر التي الtag مالها tr ؟؟ لنرى صورتنا السابقة
ترى ان العنصر المحدد صاحب التاغ tr يحتوي على العناصر المطلوب استخراجها
لذلك قمت بكتابة هذا الكود
PHP كود :
doc.DocumentNode.SelectNodes("//tr")
وعندما يجد البرنامج عنصرا ذو تاغ tr سيقوم بالدخول للعمليات التالية
PHP كود :
Try
If node.SelectNodes(".//th")(0).InnerText = "سعر الذهب عيار 21" Then
label1.Text = node.SelectNodes(".//td")(0).InnerText
End If
Catch
End Try
try كتبت لكي لا تحصل اخطاء توقف البرنامج
الان قمت بكتابة جملة شرطية اذا تحققت سيتم الدخول الى الاكواد الي داخلها
شرط الجملة هو انه يجب ان يكون النص في العنصر صاحب التاغ th هو "سعر الذهب عيار 21"
ولكن هل ترا رمز النقطة (".//th")
يعني ان يتم تحديد العناصر صاحبة التاغ th داخل ال node الحالي فقط وليس على مستوى الصفحة
selectnode تعود بمصفوفة وقمت بتحديد باختيار العنصر 0 من المصفوفة ليتم جلبه وتتم المقارنة عليه
ليش كتبت 0 ؟؟ الجواب هو انه لايوجد اصلا سوا عنصر واحد التاغ تبعه th في الnode الحالي
انظر مرة اخرى
كما ترى يوجد فقط عنصر واحد فيه tag th لذلك اخترنا 0 وتعني (حدد اول عنصر يحتوي على tag th)
طيب لنفترض ان في الnode الحالي هناك 2 من الtag th ونريد تحديد الثانية
سنقوم بكتابة 1 بدل صفر وهكذا
الان نكمل حكايتنا
بعد ان ينجح الشرط ويتم الدخول للاكواد نرى الكود النهائي
PHP كود :
label1.Text = node.SelectNodes(".//td")(0).InnerText
ويعني نسب النص الموجود في العنصر الاول الذي يحتوي على التاغ td
داخل الnode الحالي الى الليبل
ههه جملة طويلة صح !!
المهم هذا الي راح يصير
طيب لو اردنا جلب قيمة محلات الذهب كيف سيكون الامر ؟؟
يكون هكذا
PHP كود :
label1.Text = node.SelectNodes(".//td")(1).InnerText
PHP كود :
label1.Text = node.SelectNodes(".//td")(2).InnerText
شاهد الصورة :
هل وضحت الصورة الان ؟؟
طبعا هذا الكود طويل شو . في الحقيقة انا في العادة اجلب القيمة الي اريدها من خلال سطر واحد ودون تكرار ودوران واحد ولكني سهلت عليك الكود
وفي النهاية اعرض لك صفحة تهم كل من يستعمل مكتبة htmlagilitypack
http://codingfields.com/guides/htmlagilitypack/
--
الكود كامل
PHP كود :
Public Partial Class Form1
Private Sub button1_Click(sender As Object, e As EventArgs)
Dim hweb As New HtmlAgilityPack.HtmlWeb()
Dim doc As HtmlAgilityPack.HtmlDocument = hweb.Load("http://egypt.gold-price-today.com/")
For Each node As HtmlAgilityPack.HtmlNode In doc.DocumentNode.SelectNodes("//tr")
Try
If node.SelectNodes(".//th")(0).InnerText = "سعر الذهب عيار 21" Then
label1.Text = node.SelectNodes(".//td")(0).InnerText
End If
Catch
End Try
Next
End Sub
End Class
--
للأسف الكود مكتوب بالسي شارب فما اعتقد انك راح تستفيد من السورس
فقط ارفقت الملف التنفيذي والمكتبة

