تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
كيفية احضار text من موقع الى برنامجي
#1
اهلا اخوتي الكرام

لدينا مثل هذا الموقع
http://egypt.gold-price-today.com/
و هو مختص بأسعار الذهب في مصر

هذا شكله


في برنامجي لدي label و زر
اريد انه عند الضغط على الزر يحضر لي البرنامج سعر الذهب في هذا اليوم عن طريق الأتصال بالأنترنت

وقد رأيت برنامجا بهذا الشكل تماما وبلغة vb.net ايضا لكن كان لأسعار العملات
و هي نفس الفكرة على ما اظن
طبعا لا اريد استعراض السعر في web browser بل في label

كيف هذا ؟
الرد }}}}
تم الشكر بواسطة:
#2
تريد سعر الذهب بادولار لو ؟؟؟

وأي عيار من الذهب؟؟
الرد }}}}
تم الشكر بواسطة:
#3
الشاكي لله كتب :تريد سعر الذهب بادولار لو ؟؟؟

وأي عيار من الذهب؟؟


اخي انا اريد ان اتعلم كيفية تنفيذ البرنامج حتى استفيد فانا تحت التعليم
لكن اذا كنت تريد تنفيذ التطبيق
فانا اريد سعرة بالجنيه ، و العيار 21 على سبيل المثال
الرد }}}}
تم الشكر بواسطة:
#4
نحمده ونصلي على رسوله الكريم

المثال بالسي شارب :p
هذا الكود بعد ترجمته للبيسك ولكن من خلال موقع للترجمة ولا ادري هل هو صحيح 100% ام لا Rolleyes
كود :
[align=left]Public Partial Class Form1
    Inherits Form
    Public Sub New()
        InitializeComponent()
    End Sub

    Private loaded As Boolean = False
    Private i As Integer = 0

    Private Sub Form1_Load(sender As Object, e As EventArgs)
        loaded = True
    End Sub

    Private Sub wb_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs)
        If Not loaded Then
            Return
        End If
        i += 1
        If i > 1 Then
            Return
        End If

        Dim th As HtmlElementCollection = wb.Document.GetElementsByTagName("th"), td As HtmlElementCollection = wb.Document.GetElementsByTagName("td")

        For Each h As HtmlElement In th
            If h.OuterText.Contains("سعر") OrElse h.OuterText.Contains("اسعار") Then
                lv.Items.Add(h.OuterText)
            End If
            If h.OuterText.Contains("اسعار كيلو الذهب") Then
                Exit For
            End If
        Next

        Dim t As Integer = 0, s As Integer = 0

        For Each d As HtmlElement In td
            If Not d.OuterText.Contains("اخر تحديث") Then
                lv.Items(t).SubItems.Add(d.OuterText)
            Else
                Text = d.OuterText
                Exit For
            End If

            s += 1
            If s > 2 Then
                t += 1
                s = 0
            End If
        Next

        lv.Enabled = True
        UseWaitCursor = False
    End Sub
End Class
[/align]


الملفات المرفقة
.zip   GoldPrice.zip (الحجم : 13.96 ك ب / التحميلات : 53)
الرد }}}}
تم الشكر بواسطة:
#5
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"
ليقوم البرنامج بتحديد جميع العناصر التي يبدأ الtag تبعها ب 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 ObjectAs 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 

--
للأسف الكود مكتوب بالسي شارب فما اعتقد انك راح تستفيد من السورس

فقط ارفقت الملف التنفيذي والمكتبة


الملفات المرفقة
.zip   GetgoldPrices.zip (الحجم : 64.68 ك ب / التحميلات : 57)
.zip   Html Agility Pack.zip (الحجم : 127.67 ك ب / التحميلات : 46)
الرد }}}}
تم الشكر بواسطة:
#6
DreamsDotNet كتب :نحمده ونصلي على رسوله الكريم

المثال بالسي شارب :p
هذا الكود بعد ترجمته للبيسك ولكن من خلال موقع للترجمة ولا ادري هل هو صحيح 100% ام لا Rolleyes
كود :
[align=left]Public Partial Class Form1
    Inherits Form
    Public Sub New()
        InitializeComponent()
    End Sub

    Private loaded As Boolean = False
    Private i As Integer = 0

    Private Sub Form1_Load(sender As Object, e As EventArgs)
        loaded = True
    End Sub

    Private Sub wb_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs)
        If Not loaded Then
            Return
        End If
        i += 1
        If i > 1 Then
            Return
        End If

        Dim th As HtmlElementCollection = wb.Document.GetElementsByTagName("th"), td As HtmlElementCollection = wb.Document.GetElementsByTagName("td")

        For Each h As HtmlElement In th
            If h.OuterText.Contains("سعر") OrElse h.OuterText.Contains("اسعار") Then
                lv.Items.Add(h.OuterText)
            End If
            If h.OuterText.Contains("اسعار كيلو الذهب") Then
                Exit For
            End If
        Next

        Dim t As Integer = 0, s As Integer = 0

        For Each d As HtmlElement In td
            If Not d.OuterText.Contains("اخر تحديث") Then
                lv.Items(t).SubItems.Add(d.OuterText)
            Else
                Text = d.OuterText
                Exit For
            End If

            s += 1
            If s > 2 Then
                t += 1
                s = 0
            End If
        Next

        lv.Enabled = True
        UseWaitCursor = False
    End Sub
End Class
[/align]

اسف اخي ردك تزامن مع ردي لم اكن اعلم ذلك

ولكن كودك صحيح وانا فقط قدمت طريقة اخرى
الرد }}}}
تم الشكر بواسطة:
#7

السلام عليكم ورحمة الله وبركاته






وهذه طريقة أخرى ولكني وجدت الأخوة الكرام سبقوني بالحلول أثناء تجهيز المثال بارك الله فيهم

هذه الطريقة باستخدام تحليل html النص فقط (وهي تصلح لموقع محدد)






السلام عليكم ورحمة الله وبركاته


الملفات المرفقة
.rar   Egypt gold price today-01.rar (الحجم : 122.07 ك ب / التحميلات : 151)
 
 
@@@ سامحوني، منقطع نهائياً @@@

 
الرد }}}}
تم الشكر بواسطة:
#8
لا أعرف كيف اشكركم والله يا أفضل و أروع أعذاء منتدى في الكون:d
ما شاء الله خبراء دوليون و الله
كل هذه طرق مختلفه بارك الله فيكم و جازاكم الخير شكرا شكرا شكرا
شكرا شكرا شكرا شكرا شكرا
Smile
الرد }}}}
تم الشكر بواسطة:
#9
الرابط مش شغال ؟؟؟

Egypt gold price today-01.rar
الرابط مش شغال
الرد }}}}
تم الشكر بواسطة:
#10
المثال مرفق
لاول مرة استفيد من برنامج نسخ المنتدى الذي صممتهSmile
الملف هو:
Egypt gold price today-01.rar


الملفات المرفقة
.rar   ege.rar (الحجم : 122.07 ك ب / التحميلات : 47)
أستودعكم الله الذي لا تضيع ودائعه أرجو ان تجدوا بمشاركاتي ما يجعلكم تدعون لي بخير ان تحتم غيابي.
الرد }}}}
تم الشكر بواسطة: kslawy , الشاكي لله , Mostafa Saad


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  كيفية تخفيض مستوي الامان في الاكسل atefkhalf2004 7 80 28-11-16, 06:48 PM
آخر رد: atefkhalf2004
Question [VB.NET] كيفية ربط أى حقل IFieldObject بعمود بجدول برمجياً Crystal Reports newvbdev 4 110 23-11-16, 08:51 PM
آخر رد: newvbdev
  sms كيف أرسل عن طريق برنامجي adel27 6 117 22-11-16, 09:17 PM
آخر رد: adel27
  تقسيم text الى عدة listbox rabeh.ram 4 98 22-11-16, 12:06 AM
آخر رد: rabeh.ram
  [VB.NET] كيف اعمل برنامجي اصدار تجريبي... 3asfa~mdmra 0 46 16-11-16, 01:58 AM
آخر رد: 3asfa~mdmra
  كيفية تغير رسائل الخطأ؟ noway 3 69 11-11-16, 05:37 PM
آخر رد: ممدوح
  [VB.NET] كيفية طباعة شهادات بصيغة PDF Programmer_2017 9 245 10-11-16, 10:02 PM
آخر رد: Programmer_2017
  [VB.NET] كيفية تحميل صورة من قاعدة بيانات اكسس 2010 نوريس 2 105 09-11-16, 12:32 PM
آخر رد: نوريس
  [VB.NET] كيفية التعامل مع العلاقات برمجياً ؟؟؟؟ thevirus 4 139 06-11-16, 08:22 PM
آخر رد: thevirus
  الكتابة فى ملف text Mohamed20 1 65 31-10-16, 11:39 PM
آخر رد: silverlight

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم