.NET 및 WebBrowser 또는 mshtml.HTMLDocument를 사용하여 동적으로 HTML 코드를 생성하는 방법
소개
.NET을 사용하여 HTML 코드를 동적으로 생성하면 웹 페이지 콘텐츠에 대한 유연성과 제어 기능이 제공됩니다. 이 문서에서는 동적 HTML 코드를 검색하기 위한 두 가지 접근 방식, 즉 System.Windows.Forms의 WebBrowser 클래스를 활용하고 Microsoft HTML 개체 라이브러리 어셈블리의 COM 인터페이스 mshtml.HTMLDocument를 활용하는 방법을 살펴봅니다.
접근 방법 1: 활용 WebBrowser
WebBrowser 클래스는 웹 페이지를 로드하고 해당 콘텐츠에 액세스하는 데 편리한 옵션입니다. 다음 코드는 WebBrowser DocumentCompleted 이벤트를 사용하여 페이지를 로드하고 HTML을 검색하는 방법을 보여줍니다.
<code class="csharp">WebBrowser wb = new WebBrowser(); wb.Navigate("https://www.google.com/#q=where+am+i"); wb.DocumentCompleted += delegate(object sender, WebBrowserDocumentCompletedEventArgs e) { mshtml.IHTMLDocument2 doc = (mshtml.IHTMLDocument2)wb.Document.DomDocument; foreach (IHTMLElement element in doc.all) { System.Diagnostics.Debug.WriteLine(element.outerHTML); } };</code>
접근 방법 2: mshtml.HTMLDocument 활용
mshtml. HTMLDocument 인터페이스는 HTML 문서와 상호 작용하는 직접적인 방법을 제공합니다. 이를 사용하여 문자열에서 HTML을 로드하고 액세스할 수 있습니다.
<code class="csharp">mshtml.IHTMLDocument2 doc = (mshtml.IHTMLDocument2)new mshtml.HTMLDocument(); doc.write(new System.Net.WebClient().DownloadString("https://www.google.com/#q=where+am+i")); foreach (IHTMLElement e in doc.all) { System.Diagnostics.Debug.WriteLine(e.outerHTML); }</code>
WebBrowser 및 mshtml.HTMLDocument의 제한 사항
WebBrowser 및 mshtml.HTMLDocument 접근 방식 모두 다음과 같습니다. 항상 완전히 렌더링된 HTML 코드를 반환하는 것은 아닙니다. 이 문제를 해결하기 위해 비동기/대기 및 취소 토큰을 사용하는 향상된 접근 방식이 참조 콘텐츠에 향상된 응답으로 제공됩니다. 이 접근 방식은 HTML 변경 사항을 동적으로 모니터링하고 완전히 렌더링되면 콘텐츠를 검색합니다.
코드 샘플
다음 최적화된 코드는 향상된 접근 방식을 보여줍니다.
<code class="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; } async void MainForm_Load(object sender, EventArgs e) { try { var cts = new CancellationTokenSource(10000); // cancel in 10s var html = await LoadDynamicPage("https://www.google.com/#q=where+am+i", cts.Token); MessageBox.Show(html.Substring(0, 1024) + "..." ); // it's too long! } catch (Exception ex) { MessageBox.Show(ex.Message); } } async Task<string> LoadDynamicPage(string url, CancellationToken token) { 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 DocumentCompleted } finally { this.webBrowser.DocumentCompleted -= handler; } } var documentElement = this.webBrowser.Document.GetElementsByTagName("html")[0]; var html = documentElement.OuterHtml; while (true) { await Task.Delay(500, token); if (this.webBrowser.IsBusy) continue; var htmlNow = documentElement.OuterHtml; if (html == htmlNow) break; html = htmlNow; } token.ThrowIfCancellationRequested(); return html; } 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>
이 코드는 HTML 콘텐츠를 검색하기 전에 페이지가 완전히 렌더링되도록 보장하여 더 정확하고 안정적인 결과를 제공합니다.
위 내용은 .NET을 사용하여 HTML 코드를 동적으로 생성하는 접근 방식은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!