소개
HTML 코드를 동적으로 검색 웹 페이지에서 생성되는 것은 웹 자동화 및 스크래핑 시나리오에서 일반적인 작업입니다. .NET에서는 이를 달성하기 위해 System.Windows.Forms.WebBrowser 클래스와 mshtml.HTMLDocument 인터페이스라는 두 가지 옵션을 제공합니다. 그러나 효과적으로 사용하는 것은 어려울 수 있습니다.
WebBrowser 클래스
System.Windows.Forms.WebBrowser 클래스는 애플리케이션 내에 웹 페이지를 포함하도록 설계되었습니다. 사용자 정의 탐색 및 문서 이벤트를 지원하지만 동적으로 생성된 HTML을 캡처하는 기능은 제한되어 있습니다.
다음 코드 조각은 WebBrowser 사용을 보여줍니다.
<code class="csharp">using System.Windows.Forms; using mshtml; namespace WebBrowserTest { public class Program { public static void Main() { 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); } }; Form f = new Form(); f.Controls.Add(wb); Application.Run(f); } } }</code>
mshtml.HTMLDocument 인터페이스
mshtml.HTMLDocument 인터페이스는 기본 HTML 문서 개체에 대한 직접 액세스를 제공합니다. 그러나 수동 탐색 및 렌더링이 필요하므로 동적으로 생성된 콘텐츠에는 덜 편리합니다.
다음 코드 조각에서는 mshtml.HTMLDocument 사용을 보여줍니다.
<code class="csharp">using mshtml; namespace HTMLDocumentTest { public class Program { public static void Main() { 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의 한계를 극복하려면 다음 접근 방식을 사용할 수 있습니다.
예제 코드
다음 C# 코드는 이 접근 방식을 보여줍니다.
<code class="csharp">using System; using System.ComponentModel; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using mshtml; namespace DynamicHTMLFetcher { public partial class MainForm : Form { public MainForm() { InitializeComponent(); this.webBrowser.DocumentCompleted += WebBrowser_DocumentCompleted; this.Load += MainForm_Load; } private 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); } } private 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; // no changes detected, end the poll loop html = htmlNow; } token.ThrowIfCancellationRequested(); return html; } private void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { // Intentional no-op handler, we receive the DocumentCompleted event in the calling method. } } }</code>
이 접근 방식을 사용하면 동적으로 생성된 경우에도 완전히 렌더링된 HTML 코드를 얻을 수 있습니다.
위 내용은 .NET을 사용하여 제한 없이 동적으로 생성된 HTML 코드를 검색하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!