> 백엔드 개발 > C++ > .NET의 WebBrowser 및 mshtml.HTMLDocument를 사용하여 동적으로 생성된 HTML을 효율적으로 검색하는 방법은 무엇입니까?

.NET의 WebBrowser 및 mshtml.HTMLDocument를 사용하여 동적으로 생성된 HTML을 효율적으로 검색하는 방법은 무엇입니까?

DDD
풀어 주다: 2025-01-15 12:06:16
원래의
188명이 탐색했습니다.

How to Efficiently Retrieve Dynamically Generated HTML Using .NET's WebBrowser and mshtml.HTMLDocument?

.NET의 WebBrowser 및 mshtml.HTMLDocument를 사용하여 동적으로 생성된 HTML 추출

동적으로 생성된 HTML 콘텐츠를 가져오는 것은 .NET의 WebBrowser 또는 mshtml.HTMLDocument을 개별적으로 사용할 때 문제가 됩니다. 아래 코드 예시와 같이 두 가지를 모두 결합한 우수한 방법이 있습니다.

<code class="language-csharp">using Microsoft.Win32;
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WbFetchPage
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            SetFeatureBrowserEmulation();
            InitializeComponent();
            this.Load += MainForm_Load;
        }

        // Initiate the asynchronous HTML retrieval
        async void MainForm_Load(object sender, EventArgs e)
        {
            try
            {
                var cts = new CancellationTokenSource(10000); // 10-second timeout
                var html = await LoadDynamicPage("https://www.google.com/#q=where+am+i", cts.Token);
                MessageBox.Show(html.Substring(0, 1024) + "..." ); // Display a truncated result
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        // Asynchronous function to retrieve the HTML content
        async Task<string> LoadDynamicPage(string url, CancellationToken token)
        {
            // Navigate and wait for DocumentCompleted event
            var tcs = new TaskCompletionSource<bool>();
            WebBrowserDocumentCompletedEventHandler handler = (s, arg) => tcs.TrySetResult(true);

            using (token.Register(() => tcs.TrySetCanceled(), useSynchronizationContext: true))
            {
                this.webBrowser.DocumentCompleted += handler;
                try
                {
                    this.webBrowser.Navigate(url);
                    await tcs.Task; // Wait for page load
                }
                finally
                {
                    this.webBrowser.DocumentCompleted -= handler;
                }
            }

            // Get the root HTML element
            var documentElement = this.webBrowser.Document.GetElementsByTagName("html")[0];

            // Asynchronously poll for HTML changes
            string html = documentElement.OuterHtml;
            while (true)
            {
                // Wait asynchronously (cancellation possible)
                await Task.Delay(500, token);

                // Continue polling if the browser is busy
                if (this.webBrowser.IsBusy)
                    continue;

                string htmlNow = documentElement.OuterHtml;
                if (html == htmlNow)
                    break; // No changes, exit loop

                html = htmlNow;
            }

            // Check for cancellation
            token.ThrowIfCancellationRequested();
            return html;
        }

        // Enable HTML5 emulation (for IE10+)
        // More details: https://stackoverflow.com/a/18333982/1768303
        static void SetFeatureBrowserEmulation()
        {
            if (LicenseManager.UsageMode != LicenseUsageMode.Runtime)
                return;
            var appName = System.IO.Path.GetFileName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);
            Registry.SetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION",
                appName, 10000, RegistryValueKind.DWord);
        }
    }
}</code>
로그인 후 복사

이 코드는 WebBrowser를 사용하여 탐색하고 DocumentCompleted 이벤트를 초기 페이지 로드에 사용합니다. 그런 다음 비동기 폴링 메커니즘(Task.Delay())을 사용하여 OuterHtml 속성의 변경 사항을 모니터링합니다. 더 이상의 변경 사항이 감지되지 않고 브라우저가 유휴 상태일 때 루프가 종료되어 완전히 렌더링된 HTML을 반환합니다. 이 강력한 접근 방식은 동적 웹 콘텐츠를 효과적으로 처리합니다.

위 내용은 .NET의 WebBrowser 및 mshtml.HTMLDocument를 사용하여 동적으로 생성된 HTML을 효율적으로 검색하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿