フレームおよび iframe 内の HTML 要素を解析する
提供された Web サイトからビデオリンクを抽出しようとしているときに、<video>
タグが見つかりません。これは、Web サイトがフレーム (iframe) を使用しており、コンテンツのさまざまな部分が個別の HTML ドキュメントに効果的に分離されるためです。
この問題を解決するには、メインドキュメント内のフレームのコレクションを詳しく調べる必要があります。各フレームには独自の HTML ドキュメントが含まれており、Web サイトのすべての部分からデータを抽出するには、これらの個々のドキュメントにアクセスする必要があります。
解決策:
フレーム コレクションにアクセスするには、WebBrowser.Document.Window.Frames
属性を使用します。このコレクション内の各 HtmlWindow
には、独自の HtmlDocument
オブジェクトがあります。
Frame.Document.Body.GetElementsByTagName()
メソッドを使用して必要な要素を取得し、各フレームのドキュメントを反復処理するようにコードを変更します。 HtmlElement.GetAttribute
を使用して要素の属性を抽出します。
例:
<code class="language-csharp">List<MovieLink> moviesLinks = new List<MovieLink>(); private void Browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { var browser = sender as WebBrowser; if (browser.ReadyState != WebBrowserReadyState.Complete) return; var documentFrames = browser.Document.Window.Frames; foreach (HtmlWindow frame in documentFrames) { try { var videoElement = frame.Document.Body .GetElementsByTagName("VIDEO").OfType<HtmlElement>().FirstOrDefault(); if (videoElement != null) { string videoLink = videoElement.GetAttribute("src"); int hash = videoLink.GetHashCode(); if (moviesLinks.Any(m => m.Hash == hash)) { return; // 此 URL 的解析已完成 } string sourceImage = videoElement.GetAttribute("poster"); moviesLinks.Add(new MovieLink() { Hash = hash, VideoLink = videoLink, ImageLink = sourceImage }); } } catch (UnauthorizedAccessException) { } // 忽略此异常 catch (InvalidOperationException) { } // 忽略此异常 } }</code>
手順:
DocumentCompleted
イベントは、ブラウザーが各フレーム ドキュメントをロードするときに複数回発生する可能性があります。 以上がフレームおよび IFrame 内の HTML 要素からデータを抽出する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。