سؤال

أتطلع إلى تطوير مكشطة الويب في أشكال نافذة C#. ما أحاول إنجازه هو على النحو التالي:

  1. احصل على عنوان URL من المستخدم.
  2. قم بتحميل صفحة الويب في التحكم في IE UI (متصفح مضمن) في WinForms.
  3. اسمح للمستخدم بتحديد نص (متجاورة ، صغيرة (لا تتجاوز 50 chars)). من صفحة الويب المحملة.
  4. عندما يرغب المستخدم في استمرار الموقع (موقع HTML DOM) يجب أن يستمر في DB ، بحيث يمكن للمستخدم استخدام هذا الموقع لجلب البيانات في هذا الموقع خلال زياراته اللاحقة.

افترض أن موقع الويب المحمّل هو موقع مقترح وأن المعدل المقتبس يستمر في التغيير ، فإن الفكرة هي استمرار التسلسل الهرمي DOM حتى أتمكن من اجتيازه في المرة القادمة.

سأكون قادرًا على القيام بذلك إذا كانت جميع عناصر HTML لها سمات معرفها. في الحالة التي يكون فيها المعرف فارغًا ، لا أستطيع تحقيق ذلك.

هل يمكن لأي شخص أن يقترح فكرة صالحة على هذا (مقتطف الحد الأدنى للرمز إذا كان ذلك ممكنًا).؟

سيكون مفيدًا ، حتى لو كان بإمكانك مشاركة بعض الموارد عبر الإنترنت.

شكرًا،

فيجاي

هل كانت مفيدة؟

المحلول

تتمثل إحدى الطرق في إنشاء مجموعة من العلامات/الأنماط/المعرف إلى العنصر الذي تريد تحديده.

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

مثال:

<html>
  <body>
    <!-- lots of html -->
    <div id="main">
       <div>
          <span>
             <div class="pricearea">
                <table> <!-- with price data -->

بالنسبة إلى Exmaple ، ستخزن في DB الخاص بك سلسلة من: id = main] ، div ، span ، div ، table او ربما div [class = pricearea] ، الجدول.

يمكن أيضًا استخدام أنماط/فئات لإنشاء مسارك. إنه اختيارك للبحث عن علامة أو سمة لعلامة أو مجموعة. تريدها دقيقة قدر الإمكان مع عدد قليل من العناصر لجعلها قوية.

إذا كان التصميم نادراً ما يتغير ، فسيتيح لك ذلك الانتقال إلى نفس الموقع في كل مرة.

أود أيضًا أن أقترح عليك استخدام HTML ATCILITY PACK أو شيء مشابه لحلية DOM ، لأن التحكم IE بطيء.

شاشة Drassing ممتعة ، ولكن من الصعب الحصول عليها 100 ٪ لجميع الصفحات. حظا طيبا وفقك الله!

نصائح أخرى

بعد قليل من googling ، واجهت حلًا بسيطًا إلى حد ما. أدناه المرفق هو مقتطف العينة.

if (webBrowser.Document != null)
        {
            IHTMLDocument2 HtmlDoc = (IHTMLDocument2)webBrowser.Document.DomDocument;// loads the HTML DOM
            IHTMLSelectionObject selection = HtmlDoc.selection;// Fetches the currently selected HTML Element.
            IHTMLTxtRange range = (IHTMLTxtRange)selection.createRange();
            IHTMLElement parentElement = range.parentElement();// Identifies the parent element
            targetSourceIndex = parentElement.sourceIndex;               
            //dataLocation = range.parentElement().id;                
            MessageBox.Show(range.text);//range.parentElement().sourceIndex
        }

لقد استخدمت أ متصفح الويب المضمن في تطبيقات WinForms ، التي تقوم بتحميل HTML DOM في صفحة الويب الحالية.

ال ihtmlelement يكشف المثيل خاصية تسمى "SourceIndex" والتي تُخصص معرفًا فريدًا لكل عنصر من عناصر HTML.

يمكن للمرء تخزين هذا المصدر إلى DB والاستعلام عن المحتوى في هذا الموقع. باستخدام الكود التالي.

if (webBrowser.Document != null)
            {
                IHTMLDocument2 HtmlDoc = (IHTMLDocument2)webBrowser.Document.DomDocument;
                IHTMLElement targetElement = null;
                foreach (IHTMLElement domElement in HtmlDoc.all)
                {
                    if (domElement.sourceIndex == int.Parse(node.InnerText))// fetching the persisted data from the XML file.
                    {
                        targetElement = domElement;
                        break;
                    }
                }

                MessageBox.Show(targetElement.innerText); //range.parentElement().sourceIndex
            }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top