تمت الإجابة جلب الروابط داخل النصوص بالريجيكس

تم تحميل الصفحة في 1,6431841 ثانية
جلب الروابط داخل النصوص بالريجيكس
الحالة
مغلق و غير مفتوح للمزيد من الردود.

ابو روضة

.:: إداري النقطة العامة ::.
rankrankrankrankrankrank
إنضم
28 أكتوبر 2012
المشاركات
4,366
الإعجابات
5,425
النقاط
223
الإقامة
القاهرة
السلام عليكم اخوتى
كيف اجلب الروابط داخل الاسماء من خلال الريجيكس
فانا اجلب الاسماء فقط هكذا على سبيل المثال
C#:
Dim web As New WebClient()
       web.Encoding = Encoding.Default
       Dim result As String = web.DownloadString("https://www.gametop.com/category/windows-7-games.html")
       Dim a12 As MatchCollection = Regex.Matches(result, "<h3 class=""title"">(.+?)<\/h3>", RegexOptions.IgnoreCase)
       For i = 0 To a12.Count - 2
           ListBox1.Items.Add(a12(i).Groups(1).Value)
       Next
فكيف أدمج الرابط داخل الاسم كما نفعل بالويب براوزر والHtmlAgilityPack فهذا الكود مثلا يجلب الرابط
داخل الاسم
C#:
For Each n As HtmlAgilityPack.HtmlNode In doc.DocumentNode.SelectNodes("//tr/td/font/a")
           ListBox1.Items.Add(n.InnerText)
           lst.Add("http://saaid.net/tarbiah/" & n.Attributes("href").Value)
           Me.Text = ListBox1.Items.Count
       Next
ولكنى لم أتطرق لها فى الريجيكس الى االان أو لم افهمها
فلو سمحتم ممكن طريقة مبسطة افهم بها
 
إنضم
30 يناير 2012
المشاركات
2,549
الإعجابات
3,041
النقاط
113
الإقامة
Egypt
وعليكم السلام ورحمة الله وبركاتة

تفضل المشروع اخي :

VB TEST | تحميل

وهذا الكود :


كود:
Imports System.Text.RegularExpressions

Public Class Form1
    Dim MyData As New Dictionary(Of String, String)
    
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        '<ahref='(.+)\/(?:.*\n)+<h3class="title">(.+)<
        Dim pageSource As String = New Net.WebClient().DownloadString("https://www.gametop.com/category/windows-7-games.html")
        pageSource = pageSource.Replace(vbCr, "").Replace(vbLf, "")
        Dim divResults As MatchCollection = Regex.Matches(pageSource, "<div\s*class=""large-\d\s*medium-\d\s*small-\d+\s*columns"">.*?<\/div>")

        For Each I As Match In divResults
            Dim subResult As Match = Regex.Match(I.Value, "<a\s*href='(.+)'\s.+<h3\sclass=""title"">(.+)<\/h3>")
            Dim GameLink$ = "https://www.gametop.com" + subResult.Groups(1).Value
            Dim GameName$ = subResult.Groups(2).Value
            MyData.Add(GameName, GameLink)
            ListBox1.Items.Add(GameName)
        Next
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Dim index As Integer = ListBox1.SelectedIndex
        If (index = -1) Then
            MsgBox("Please Select The Game", MsgBoxStyle.Information)
            Exit Sub
        End If

        Process.Start(MyData(ListBox1.Items.Item(index)))

    End Sub
End Class
بالتوفيق وفي آمان الله
 

ابو روضة

.:: إداري النقطة العامة ::.
rankrankrankrankrankrank
إنضم
28 أكتوبر 2012
المشاركات
4,366
الإعجابات
5,425
النقاط
223
الإقامة
القاهرة
وعليكم السلام ورحمة الله وبركاتة

تفضل المشروع اخي :

VB TEST | تحميل

وهذا الكود :


كود:
Imports System.Text.RegularExpressions

Public Class Form1
    Dim MyData As New Dictionary(Of String, String)
   
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        '<ahref='(.+)\/(?:.*\n)+<h3class="title">(.+)<
        Dim pageSource As String = New Net.WebClient().DownloadString("https://www.gametop.com/category/windows-7-games.html")
        pageSource = pageSource.Replace(vbCr, "").Replace(vbLf, "")
        Dim divResults As MatchCollection = Regex.Matches(pageSource, "<div\s*class=""large-\d\s*medium-\d\s*small-\d+\s*columns"">.*?<\/div>")

        For Each I As Match In divResults
            Dim subResult As Match = Regex.Match(I.Value, "<a\s*href='(.+)'\s.+<h3\sclass=""title"">(.+)<\/h3>")
            Dim GameLink$ = "https://www.gametop.com" + subResult.Groups(1).Value
            Dim GameName$ = subResult.Groups(2).Value
            MyData.Add(GameName, GameLink)
            ListBox1.Items.Add(GameName)
        Next
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Dim index As Integer = ListBox1.SelectedIndex
        If (index = -1) Then
            MsgBox("Please Select The Game", MsgBoxStyle.Information)
            Exit Sub
        End If

        Process.Start(MyData(ListBox1.Items.Item(index)))

    End Sub
End Class
بالتوفيق وفي آمان الله
جزاك الله كل الخيرات أخى محمود مااشاء الله عليك...
ممكن لو سمحت تفهمنى ماذا كان ينقصنى لآنى أريد ان أفهم
لآن هذا الموضوع مهم جداً....
يعنى انا فوق جلبت الأسماء فأنت ازاى دمجت الاسماء داخل الروابط ؟
يعنى نبذة مبسطة فقط لو تسمح+ أختيار أفضل اجابة طبعاً
 

Spawner Freezo

.:: مُساعد مُشرف أقسام البرمجة ::.
rankrank
إنضم
12 أبريل 2015
المشاركات
355
الإعجابات
533
النقاط
93
العمر
22
الإقامة
Morocco

إنتظرت كثيرة على ماأعتقد ههه.

في بادء الأمر ، لماذا لا ننظم عملياتنا؟

  • تحميل HTML من صفحة الويب.​
  • الحصول على العناوين للألعاب.​
  • الحصول على روابط التحميل للألعاب.​

ϟ سؤال : كيف يمكننا القيام بهاته الخطوات ؟
 ← هناك الكثير من الطرق لتحميل HTML Text Document ، ولكن بطبيعة الحال أبسط / أسهل هي من خلال WebClient

ϟ قاعدة :
 ← إذا كانت method التي تريد استخدامها تحتوي على خيار Asynchronous. من فضلك ، استفد من ذلك ، لأنك لا ترغب في تجميد واجهة المستخدم الخاصة بك ، وبالطبع تريد أداء جيد. في هذه الحالة استخدم DownloadStringTaskAsync + await، بدلا من DownloadString.

حسنًا ،الأن لدينا الآن HTML Text ، كيف يمكننا جلب المعلومات المطلوبة ؟
صراحةً، هناك الكثير من الطرق :

ϟ طرق :

   Regex
   HTMLAgilityPack
   تلاعب بل Strings methods مثلاً -> ( Replace ، Substring ، IndexOf -> إنشاء دالة لإرجاع ما هو بين Strings )
   Any other external Lib that's made for Web Scrapping in general

ϟ قاعدة :
 ← من الجيد الالتزام بخيار واحد ، لا تستعملهم جميعاً في نفس الدالة أو العملية. ( هي فقط من أجل Readability )
فأنا مثلاً أفضل استخدام HTMLAgility بسبب دعم XPATH ؛للحصول على الجزء الذي تريده ، إستعمال هاته المكتبة يجعل الأمور أسهل ، ويمكن أن يكون أسرع بكثير من Regex في حالة وجود بيانات كبيرة.


ϟ سؤال : كيف نحصل على Titles مع الروابط في نفس الوقت باستخدام Regex ؟
 ← حسنا بالطبع في بعض الأحيان كنت ترغب في الحصول على بيانات متعددة ، بالطبع ، Regex ، ليس لديها . InnerText أو InnerHtml ، حيث أنها ليست ل HTML خصيصاً، بشكل عام ، فإنه يعالج Strings بستعمل Pattern المدخل.
منطقيا ، في حالتنا ، عدد العناوين يساوي (==) عدد الروابط الخاص بهم ؟يعني المستحيل عدم الحصول على نفس المقدار.
على سبيل المثال ، لدينا 50 عنوانًا و 50 رابطًا للعناوين.


ϟ خطوات :
 ← قم بعمل loop عبر أرقام مقدار عدد العناوين أو الروابط.
 ← للحصول على بيانات متعددة باستخدام Regex ، يمكنك إجراء ذلك باستخدام Regex.Matches

C#:
            Dim web As New WebClient()
            Dim HTMLData = Await web.DownloadStringTaskAsync("https://www.gametop.com/category/windows-7-games.html")

C#:
            // Obtain all titles and their links
            Dim mCollection = Regex.Matches( HTMLData, "<a href='(.*?)' onclick=""ga|<h3 class=""title"">(.*?)</h3>" )
            // Loop through the entire collection(- 1) found.
            For id As Integer = 0 To mCollection.Count - 2
                // Get Group 1 in the collection that is the Title
                // then Add website link to get the complete host with the game.
                // and get a valid Link.
                Dim getLink  = mCollection( id ).Groups( 1 ).Value.Insert( 0, "https://www.gametop.com" )
                // Get the Title.
                Dim getTitle = mCollection( id + 1 ).Groups( 2 ).Value
                // If our entry is empty let's skip it.
                If String.IsNullOrEmpty( getTitle ) OrElse String.IsNullOrEmpty( getLink ) Then
                        Continue For
                    End If
                // add our items to the listView.
                listView1.Items.Add( getLink ).SubItems.Add( getTitle )
            Next id

C#:
        // Everything is clear here.
        Private Sub listView1_MouseDoubleClick(ByVal sender As Object, ByVal e As MouseEventArgs)
            If listView1.Items.Count < 0 Then
                Return
            End If

            Dim index As ListViewHitTestInfo = listView1.HitTest(e.Location)
            Process.Start(index.SubItem.Text)
        End Sub
ϟ شرح : تقول لل-Regex ابحت عن ما بين X و-Y أو إذا وجدت أيضاً ما بين A و-B، ضعه في Collection. إذا لدينا في Collection الخاص ب-Regex، مجموعتين، يعني [Group[1 و-[Group[2 أيضاً.
الأن Loop، وجدنا في صفحة 50 لعبة، إذاً 50 عنوان و-50 رابط ...

 X هو ← <a href='
 Y هو ← ' onclick=""ga
 ---
 A هو ← <h3 class=""title"">
 B هو ← </h3>
 ---
 ما بين ← (.*?)
 أو ← |


ϟ ملخص :

   استخدم أساليب Asynchronous لتحميل البيانات (على سبيل المثال DownloadStringTaskAsync ) (أداء أفضل)
   فضل HTMLAgilityPack على Regex في حالة جلب معلومات من صفحة معينة ب صيغة HTML. (سهل ، في جل الحالات أداء أفضل ، دعم إستخدام XPATH )
   فضل Regex عبر HTMLAgilityPack ، إذا كنت تعرف الكثير عن Patterns على ال XPATH. ( لكن أرى XPATH أسهل وأقوى لجلب معلومات HTML )


اتمنى أن تكون فهمت أخي.
بالتوفيق.
 

ابو روضة

.:: إداري النقطة العامة ::.
rankrankrankrankrankrank
إنضم
28 أكتوبر 2012
المشاركات
4,366
الإعجابات
5,425
النقاط
223
الإقامة
القاهرة
إنتظرت كثيرة على ماأعتقد ههه.

في بادء الأمر ، لماذا لا ننظم عملياتنا؟

  • تحميل HTML من صفحة الويب.​
  • الحصول على العناوين للألعاب.​
  • الحصول على روابط التحميل للألعاب.​

ϟ سؤال : كيف يمكننا القيام بهاته الخطوات ؟
 ← هناك الكثير من الطرق لتحميل HTML Text Document ، ولكن بطبيعة الحال أبسط / أسهل هي من خلال WebClient

ϟ قاعدة :
 ← إذا كانت method التي تريد استخدامها تحتوي على خيار Asynchronous. من فضلك ، استفد من ذلك ، لأنك لا ترغب في تجميد واجهة المستخدم الخاصة بك ، وبالطبع تريد أداء جيد. في هذه الحالة استخدم DownloadStringTaskAsync + await، بدلا من DownloadString.

حسنًا ،الأن لدينا الآن HTML Text ، كيف يمكننا جلب المعلومات المطلوبة ؟
صراحةً، هناك الكثير من الطرق :

ϟ طرق :

   Regex
   HTMLAgilityPack
   تلاعب بل Strings methods مثلاً -> ( Replace ، Substring ، IndexOf -> إنشاء دالة لإرجاع ما هو بين Strings )
   Any other external Lib that's made for Web Scrapping in general

ϟ قاعدة :
 ← من الجيد الالتزام بخيار واحد ، لا تستعملهم جميعاً في نفس الدالة أو العملية. ( هي فقط من أجل Readability )
فأنا مثلاً أفضل استخدام HTMLAgility بسبب دعم XPATH ؛للحصول على الجزء الذي تريده ، إستعمال هاته المكتبة يجعل الأمور أسهل ، ويمكن أن يكون أسرع بكثير من Regex في حالة وجود بيانات كبيرة.


ϟ سؤال : كيف نحصل على Titles مع الروابط في نفس الوقت باستخدام Regex ؟
 ← حسنا بالطبع في بعض الأحيان كنت ترغب في الحصول على بيانات متعددة ، بالطبع ، Regex ، ليس لديها . InnerText أو InnerHtml ، حيث أنها ليست ل HTML خصيصاً، بشكل عام ، فإنه يعالج Strings بستعمل Pattern المدخل.
منطقيا ، في حالتنا ، عدد العناوين يساوي (==) عدد الروابط الخاص بهم ؟يعني المستحيل عدم الحصول على نفس المقدار.
على سبيل المثال ، لدينا 50 عنوانًا و 50 رابطًا للعناوين.


ϟ خطوات :
 ← قم بعمل loop عبر أرقام مقدار عدد العناوين أو الروابط.
 ← للحصول على بيانات متعددة باستخدام Regex ، يمكنك إجراء ذلك باستخدام Regex.Matches

C#:
            Dim web As New WebClient()
            Dim HTMLData = Await web.DownloadStringTaskAsync("https://www.gametop.com/category/windows-7-games.html")

C#:
            // Obtain all titles and their links
            Dim mCollection = Regex.Matches( HTMLData, "<a href='(.*?)' onclick=""ga|<h3 class=""title"">(.*?)</h3>" )
            // Loop through the entire collection(- 1) found.
            For id As Integer = 0 To mCollection.Count - 2
                // Get Group 1 in the collection that is the Title
                // then Add website link to get the complete host with the game.
                // and get a valid Link.
                Dim getLink  = mCollection( id ).Groups( 1 ).Value.Insert( 0, "https://www.gametop.com" )
                // Get the Title.
                Dim getTitle = mCollection( id + 1 ).Groups( 2 ).Value
                // If our entry is empty let's skip it.
                If String.IsNullOrEmpty( getTitle ) OrElse String.IsNullOrEmpty( getLink ) Then
                        Continue For
                    End If
                // add our items to the listView.
                listView1.Items.Add( getLink ).SubItems.Add( getTitle )
            Next id

C#:
        // Everything is clear here.
        Private Sub listView1_MouseDoubleClick(ByVal sender As Object, ByVal e As MouseEventArgs)
            If listView1.Items.Count < 0 Then
                Return
            End If

            Dim index As ListViewHitTestInfo = listView1.HitTest(e.Location)
            Process.Start(index.SubItem.Text)
        End Sub
ϟ شرح : تقول لل-Regex ابحت عن ما بين X و-Y أو إذا وجدت أيضاً ما بين A و-B، ضعه في Collection. إذا لدينا في Collection الخاص ب-Regex، مجموعتين، يعني [Group[1 و-[Group[2 أيضاً.
الأن Loop، وجدنا في صفحة 50 لعبة، إذاً 50 عنوان و-50 رابط ...

 X هو ← <a href='
 Y هو ← ' onclick=""ga
 ---
 A هو ← <h3 class=""title"">
 B هو ← </h3>
 ---
 ما بين ← (.*?)
 أو ← |


ϟ ملخص :

   استخدم أساليب Asynchronous لتحميل البيانات (على سبيل المثال DownloadStringTaskAsync ) (أداء أفضل)
   فضل HTMLAgilityPack على Regex في حالة جلب معلومات من صفحة معينة ب صيغة HTML. (سهل ، في جل الحالات أداء أفضل ، دعم إستخدام XPATH )
   فضل Regex عبر HTMLAgilityPack ، إذا كنت تعرف الكثير عن Patterns على ال XPATH. ( لكن أرى XPATH أسهل وأقوى لجلب معلومات HTML )



اتمنى أن تكون فهمت أخي.
بالتوفيق.
الحقيقة الشرح منتهى الروعة والجمال ماشاء الله عليك...
وعلى فكرة انا ايضا أفضل ال HTMLAgilityPack جدا ولى موضوع عليها بموقع أخر
نتحددث فيه انا وشخص الله يكرمه عن أشياء كثيرة فيها..
الشرح هذا يحتاج تركيز عالى لآنه سيفرق كثيراً معى حقيقة ويحتاج للمذاكرة مرة ومائة الى ان استوعبه..
ليتك فعلتها بالليست بوكس لآنى مش بحب او مش بعرف اتعامل مع الليست فيو أبداً " هناك كره بيننا ههه "
لآنى مثلا أريد إخفاء الروابط وإظهار الاسماء فقط وحين الضغط على الاسم يعمل الرابط وينقلنى الى الموقع
وبالليست بوكس بعرف لكن هذه الفيو لا أعرف:31:


هى مش هاتفرق حاليا لآنى أريد مذاكرة هذا الشرح وشرح أخ فاضل أيضا الله يبارك فيه يارب وفيك عمل لى شرح للريكويست
فالواجبات كثرت وهاحتاج لبعض التنظيم.....
الله يسعدك دنيا وآخرة أخى العزيز الغالى....
 

Spawner Freezo

.:: مُساعد مُشرف أقسام البرمجة ::.
rankrank
إنضم
12 أبريل 2015
المشاركات
355
الإعجابات
533
النقاط
93
العمر
22
الإقامة
Morocco
نعم إقرأه 3 إلى أربع مرات لكي تفهم.

---

وضعه في ListBox أو ListView، يبقى أمر ثانوي و سهل، أردت فقط أن اشرح لك كيفية إشتغال.

---

يمكنك إنشاء Generic collection، تخزن فيها Key مع Value، ذلك بستعمال Dictionary، حيث يستقبل Key الذي يكون فريد ( لا يتكرر )، و-Value الخاصة به.


في هاته الحالة key هو العنوان، و-Value هو الرابط.

ثم عند ضغط على Listbox، تجلب Value من خلال Key اندكس/index وتعمل ما تريد ...
 

ابو روضة

.:: إداري النقطة العامة ::.
rankrankrankrankrankrank
إنضم
28 أكتوبر 2012
المشاركات
4,366
الإعجابات
5,425
النقاط
223
الإقامة
القاهرة
مع التجربة والمحاولات ممكن اعرف ما هو الخطأ هنا

C#:
 Dim web As New WebClient()
        Dim HTMLData = Await web.DownloadStringTaskAsync("http://www.saaid.net/book/list.php?cat=98")
        '<a href='(.*?)' onclick=""ga|<h3 class=""title"">(.*?)</h3>
        Dim mCollection = Regex.Matches(HTMLData, "<a href='(.*?)'|color=""#336497"">(.+?pdf)<\/b>")
        For id As Integer = 0 To mCollection.Count - 2
            Dim getLink = mCollection(id).Groups(1).Value.Insert(0, "http://www.saaid.net/book/open.php?")
            Dim getTitle = mCollection(id + 1).Groups(2).Value
            If String.IsNullOrEmpty(getTitle) OrElse String.IsNullOrEmpty(getLink) Then
                Continue For
            End If

            ListBox1.Items.Add(getTitle)
            lst.Add(getLink)
        Next id
وللعلم استخدمت شرح فى صفحات أخرى والحمدلله نجحت الطريقة لكن وقفت هنا فقط

احاول أجلب العناصر الأولى فقط



وجلبتها فعلا بالليست بوكس من خلال اخفاء الروابط داخل لليست
Dim lst As New List(Of String)
 

ابو روضة

.:: إداري النقطة العامة ::.
rankrankrankrankrankrank
إنضم
28 أكتوبر 2012
المشاركات
4,366
الإعجابات
5,425
النقاط
223
الإقامة
القاهرة
الحالة
مغلق و غير مفتوح للمزيد من الردود.

الأعضاء النشطين حاليآ الذين يشاهدون هذا الموضوع (1 عضو و 0 ضيف)

خيارات الاستايل

نوع الخط
مودك
اخفاء السايدر بار OFF
توسيط المنتدى OFF
فصل الأقسام OFF
الأقسام الفرعية OFF
عرض المشاركات
حجم الخط
معلومات العضو OFF
إخفاء التوقيع OFF

إرجاع خيارات الإستايل