C#のmshtmlでHTMLDocumentを取得する方法

このQ&Aのポイント
  • C#のmshtmlを使用してHTMLDocumentオブジェクトを取得する方法について解説します。
  • ブラウザコントロールを使用してHTMLDocumentを取得する方法を紹介しますが、mshtml単体ではうまくいかない場合もあります。
  • VB.netのサンプルページを参考にしてcreateDocumentFromUrlメソッドを使用してもエラーが発生することがあります。解決策を教えてください。
回答を見る
  • ベストアンサー

C#のmshtmlで・・・

C#にてmshtmlでHTMLDocumentを取得したいのです。 ブラウザコントロールを使って、以下のようにして取得することはできたのですが、 AxSHDocVw.AxWebBrowser myWebBrowser = new AxSHDocVw.AxWebBrowser(); // ドキュメントオブジェクトの獲得 mshtml.HTMLDocument myDocument = (mshtml.HTMLDocument)axWebBrowser1.Document;     mshtml単体で取得しようとしてもうまくいきません。 VB.netのサンプル紹介ページを参考にして createDocumentFromUrl(url, null); を使用してもエラーになってしまします。 どのサイトを指定しても例外が発生してしまいどうすればいいのか困っております 解決方法をご存知の方、ご教授お願いします

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

単体で取得というサンプルの載っているサイトを見つけました。 (自分では試してませんが) http://jomora.bne.jp/wiki/pukiwiki.php?C%A1%F4%2Fmshtml

omaeha
質問者

お礼

ありがとうございます! 無事取得できました。 関係ないのですが、回答通知のメールが送られてこないのはなぜなんでしょうね;_;

関連するQ&A

  • ASP(またはWSH)でMSHTMLコンポーネントを使いたい

    教えてください。 MSHTMLを使用して、DOM解析&値設定をし、自動的に画面遷移処理をしたいと考えています。 使用言語はVBScriptです。以下のようなソースを実行したところ、エラーが発生します。 Set objMSH = CreateObject("MSHTML.HTMLDocument") Set objDoc = objMSH.createElementFromUrl("http://www.google.co.jp",vbNullString) Microsoft VBScript 実行時エラー: ActiveX コンポーネントはオブジェクトを作成できません。: 'MSHTML.HTMLDocument' ネットを検索すると、VBのソースは発見できるのですが VBSでの利用方法がわかりません。 ご存知の方がいたら教えてください

  • 起動済のIEから.NET FrameworkのHtmlDocumentを取得できますか?

    【環境・言語】Windows XP + IE6 + Visual Basic 2008 既に起動しているInternet ExplorerのオブジェクトをShellWindowsから探して、SHDocVw.InternetExplorer型の変数(objIE)に代入してあります。   Dim objIE As SHDocVw.InternetExplorer   'ShellWindowsから目的のIEオブジェクトを探してobjIEに代入 ここから、mshtml.HTMLDocumentを取得するところまでは分かります。   Dim objDoc As mshtml.HTMLDocument = CType(objIE.Document, mshtml.HTMLDocument) これではなくて、.NET FrameworkのHtmlDocumentクラス(System.Windows.Forms名前空間)のオブジェクトを取得することはできるでしょうか? ↓のように無理やりやってみたら、   Dim objDoc2 As System.Windows.Forms.HtmlDocument = CType(objIE.Document, System.Windows.Forms.HtmlDocument) ↓のようなエラーが出ました。   System.InvalidCastException はハンドルされませんでした。   Message="型 'mshtml.HTMLDocumentClass' の COM オブジェクトをクラス型 'System.Windows.Forms.HtmlDocument' にキャストできません。COM コンポーネントを表す型のインターフェイスを COM コンポーネントを表さない型にキャストすることはできません。ただし、基になる COM コンポーネントがインターフェイスの IID の QueryInterface 呼び出しをサポートする場合は、インターフェイスにキャストすることができます。" mshtml.HTMLDocumentを使ってHTMLを解析していくと、COMオブジェクトの解放が大変そうなので、できれば.NET Frameworkの中で操作したいと思っています。逆(.NET Framework→COM)はHtmlDocument.DomDocumentで簡単に出来るようですが、COMから.NET Frameworkへの変換は出来ないんでしょうか?

  • AxWebBrowserで開いたWebページを操作したいのですがコンボ

    AxWebBrowserで開いたWebページを操作したいのですがコンボボックスの操作が上手くいきません。 Dim doc As mshtml.HTMLDocument doc = AxWebBrowser1.Document 'テキストボックス doc.all.item("text").innertext = "あああ" 'ラジオボタン doc.all.item("radio", 0).Checked = True テキストへの文字列の挿入とラジオボタンの制御はこれでできました。 環境はVB.NET 2005です。 どうか、よろしくお願いします。

  • フリーズする原因

    参照設定で[Microsoft HTML Object Library] Sub test1() Dim html As MSHTML.HTMLDocument Set html = New MSHTML.HTMLDocument Dim document As MSHTML.HTMLDocument Set document = html.createDocumentFromUrl("http://www.goo.ne.jp/", vbNullString) ' ダウンロード待ち Do While document.ReadyState <> "complete" Loop ' 結果出力 Debug.Print document.Body.innerHTML Set html = Nothing Set document = Nothing End Sub このコードを実行したいのですが ステップインして行かないとフリーズしてしまいます。 「ダウンロード待ち」の部分で無限ループです。 なぜでしょうか? あと、ステップインで実行したとしても 「このページには、セキュリティの危険性がある可能性があります。続行しますか?」 が毎回出てくるのですが、 非表示にするかvbaで「はい」にさせる方法はありますか?

  • C#のaxWebBrowsrでエンコードを変更する方法

    こんにちわ。 私は今、axWebBrowserを使用して インターネットブラウザを作っています。 インターネットエクスプローラーをモデルにして エンコードの変更を実装したいのですが、 期待通りに動かすにはどうれば良いか解らないので質問させて頂きます。 開発環境 OS : windowsXP 環境 : Microsoft Visual Studio 2008 言語 : C# やりたい事 コンボボックスに格納したEncodingクラスの中からエンコードを選択するとaxWebBrowserに表示されている文字列を 指定されたエンコードで再読み込みする。 動作のモデルは、インターネットエクスプローラーで 表示→エンコード→エンコードのリストの中からクリック をした時の動作です。 現在、どの様なコーディングをしていて何故できないのか? 現状の処理の流れを説明します。 エンコードを格納したコンボボックスに SelectedIndexChanged関数を作成し、 System.Net.WebClientで新しくhtmlを読み込んで Documentに読み込ませています。 以下にソースコードを書きます private void comboBox2_SelectedIndexChanged(object sender, EventArgs e) { // 選択したインデックスが0に満たない場合はリターン if (0 > comboBox2.SelectedIndex) {  return; }  // htmlを指定したエンコードで取得  System.Net.WebClient wc = new System.Net.WebClient(); // axWebBrowser1が現在表示しているurlを読み込む  System.IO.Stream st = wc.OpenRead(((mshtml.HTMLDocumentClass)axWebBrowser1.Document).url); // エンコードの決定  Encoding enc = (Encoding)comboBox2.SelectedItem;  // 指定したエンコードで読み込む  System.IO.StreamReader sr = new System.IO.StreamReader(st, enc);  // HTML取得  string html = sr.ReadToEnd();  // ストリームを閉じる  sr.Close();  st.Close(); // 取得したhtmlをaxWebBrowserに読み込ませる  ((mshtml.HTMLDocumentClass)axWebBrowser1.Document).IHTMLDocument2_write(html); } このコーディングだと htmlは読み込むのですが、 画像ファイル等のリンクが切れていて、 例えばgoogleのTOPページでインターネットエクスプローラーから ソースを表示してソースをローカルPCにhtmlファイルとして保存して そのhtmlファイルを読み込ませた時と同じ結果になっていまいます。 (webページとしてサーバーからの情報を読み込んでいないと言う表現で伝わるでしょうか?) そしてエンコードをコンボボックスから2回以上変更しようとすると 2回目にaxWebBrowserのurlがabout:blankとなりwc.OpenRead関数で 例外処理が発生します。 どうすればインターネットエクスプローラーでエンコードを変更した時の様に webページとして読み込んで エンコードが違う場合は文字化けし 適切なエンコードを選択すると文字化けが解消される といった動作を行わせることが出来るでしょうか?

  • InvalidCastExceptionエラーが

    VB.NET(VB 2010 Express)でIE9をWebBrowserコントロールではなく直接制御するアプリを作成しています。 そこで、次のURLのVBAによるHTMLソースのフレーム処理を参考にさせて頂いています。 http://vbaie.blog111.fc2.com/blog-entry-20.html そこから引用しVB.NET用にリライトした下記関数内でエラーとなっています。 'フレームのDocumentを取得する関数 Public Function IEFrameDocument(objIE As Object, url As String) As HtmlDocument Dim objFrames As mshtml.FramesCollection Dim frameDoc As HtmlDocument Dim i As Integer objFrames = objIE.document.frames For i = 0 To objFrames.Length - 1 frameDoc = objFrames.item(i).document     'エラー発生の行 If InStr(frameDoc.Url.ToString, url) Then Exit For End If Next IEFrameDocument = frameDoc End Function コメントで表示しているエラー行のエラー内容は、次のとおりです。 <InvalidCastExceptionはハンドルされませんでした。> 型 'mshtml.HTMLDocumentClass' の COM オブジェクトをクラス型'System.Windows.Forms.HtmlDocument' にキャストできません。 COM コンポーネントを表す型のインターフェイスを COM コンポーネントを表さない型にキャストすることはできません。 ただし、基になる COM コンポーネントがインターフェイスの IID の QueryInterface 呼び出しをサポートする場合は、インターフェイスにキャストすることができます。 解決方法を教えて頂きたくよろしくお願い致します。

  • VB2005でWebBrowserでログイン

    今まで、ExcelのVBAを手探り状態で使い、IEを操作していたものです宜しくお願い致します。今回、VB2005EEをインストールしたので、Excelで行っていた作業を移行させようと思ってネットでサンプルを手にいれ使おうかと考え行き詰りました。どなたか教えてください。 formにWebBrowserコントロールを貼り付けてネットのログイン画面を With WebBrowser1 .Navigate("http://xxxx.xxx.co.jp/xxx/mail?roginname=abcd123") .Document.All.GetElementsByName("acctname")(0).InnerText = "abcd123" .Document.All.GetElementsByName("passwd")(0).InnerText = "1234567" .Document.Forms(0).InvokeMember("submit") End With としたところ、.Documentの行で、オブジェクト参照がオブジェクト インスタンスに設定されていません。のエラーが出てしまいます。 ヒントには、オブジェクトインスタンスの作成には、newキーワードを使用します。と、メソッドを呼び出す前に、オブジェクトがnullでよいかどうか確認してくださいとあます。 私は、いったいどうすればいいのでしょうか?基本的な部分が分かっていないだけだと思いますが、教えて頂けないでしょうか?

  • フォントサイズ変更

    Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click 'フォントを一つ大きくする Dim s As Integer = CInt(GetFontSize(AxWebBrowser1.Controls(0))) If s <> 4 Then SetFontSize(AxWebBrowser1.Controls(0), s + 1) End Sub Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click 'フォントサイズを小さく Dim s As Integer = CInt(GetFontSize(AxWebBrowser1.Controls(0))) If s <> 0 Then SetFontSize(AxWebBrowser1.Controls(0), s - 1) End Sub GetFontSizeとSetFontSizeにエラーが出ます。 どうすればエラーを消せますか。 よろしくお願いします。 環境 XP 使用言語 VB.NET2003

  • ブラウザのフォームのエレメント番号を取得したいです。VB.NET

    AxWebBrowserに表示したウェブページのJavaScriptフォームの エレメントのIDを指定して、番号を取得したいです。 Dim a As String For i As Integer = 0 To 200 a = AxWebBrowser1.Document.forms(0).Elements(i).id Console.WriteLine(i & " - " & a) Next 上記の方法で0~200までのIDを取得する方法で 番号とIDを知ることが出来るのですが、 IDの種類が多数ある場合、この方法だと不都合が多いので、 単純にIDを指定して番号を知る方法を探しています。 (IDは事前に分かっているので) Dim a As mshtml.HTMLElementCollection Dim a1 As mshtml.HTMLInputElementClass a = AxWebBrowser1.Document.forms(0) Dim i As Integer a1 = a.namedItem("title") i = a1.~~~~~ 上記のような方法で”title”が何番目なのか調べたいのですが、 ~~~~~~部分を色々試してみたのですが、どれも正しい動作にはなりませんでした。 このような方法でエレメントのIDから番号を取得する方法がありましたらご教授頂けると助かります。

  • VB.NETからWEBブラウザの操作について

    VS2008 VB.NETにて開発を行っています。 プログラムからIEにて開いたWEBサイトに IDとパスワードを自動入力し自動ログインする処理を作成しています。 IDとパスワードの入力については、サンプルサイトなどからお借りして 以下のように作成し実現できました。 Dim ieDoc As mshtml.HTMLDocument = CType(IE.Document, mshtml.HTMLDocument) Dim elCol As mshtml.IHTMLElementCollection = CType(ieDoc.all, mshtml.IHTMLElementCollection) Dim usTxt As mshtml.HTMLInputTextElement = DirectCast(elCol.item("username"), mshtml.HTMLInputTextElement) Dim psTxt As mshtml.HTMLInputTextElement = DirectCast(elCol.item("password"), mshtml.HTMLInputTextElement) Dim elBtn As mshtml.HTMLButtonElement = CType(elCol.item("???"), mshtml.HTMLButtonElement) usTxt.value = "xxxxx" psTxt.value = "xxxxx" elBtn.click() ただログインボタンクリックの部分にnameのTAGがなく以下のような通常のクリック動作を行う ソースになっています。 ・ログインする対象のWEBサイトのソース <td colspan="2" class="white centerPosT"> <a href="#" onclick="javascript:login(); return false;"> <img src="/images/btn_login.gif" alt="ログイン" onmouseout="javascript:showUp(this)" onmousedown="javascript:showDown(this)" /> </a> </td> このような場合にログインをクリックさせるにはどのような方法で行えばよろしいのでしょうか?

専門家に質問してみよう