C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

Webbrowserコントロールにつきまして /ak (18/05/12(Sat) 13:39) #87334
Re[1]: Webbrowserコントロールにつきまして /WebSurfer (18/05/12(Sat) 15:17) #87335
│└ Re[2]: Webbrowserコントロールにつきまして /魔界の仮面弁士 (18/05/14(Mon) 11:12) #87343
Re[1]: Webbrowserコントロールにつきまして /WebSurfer (18/05/12(Sat) 16:16) #87336
Re[1]: Webbrowserコントロールにつきまして /WebSurfer (18/05/12(Sat) 16:40) #87337
  └ Re[2]: Webbrowserコントロールにつきまして /ak (18/05/12(Sat) 19:00) #87338 解決済み
    └ Re[3]: Webbrowserコントロールにつきまして /WebSurfer (18/05/12(Sat) 20:14) #87339 解決済み
      └ Webbrowserコントロールにつきまして /ak (18/05/12(Sat) 22:22) #87340
        └ Re[5]: Webbrowserコントロールにつきまして /WebSurfer (18/05/12(Sat) 23:20) #87341
          └ Re[6]: Webbrowserコントロールにつきまして /ak (18/05/12(Sat) 23:47) #87342 解決済み
            └ Re[7]: Webbrowserコントロールにつきまして /ak (18/05/14(Mon) 16:33) #87352 解決済み


親記事 / ▼[ 87335 ] ▼[ 87336 ] ▼[ 87337 ]
■87334 / 親階層)  Webbrowserコントロールにつきまして
□投稿者/ ak (35回)-(2018/05/12(Sat) 13:39:55)

分類:[VB6 以前] 

2018/05/14(Mon) 17:21:54 編集(投稿者)

度々、お世話になります。

Webbrowserコントロールにつきまして

webBrowserコントロールでurl https://www.msn.com/ja-jpを起動しますと頭から
タグ(window._perfMarker ・・・)が表示されます。タグが文字列として取得された為、また
タグを表示させない為にはurl側でwebBrowserに合ったソースで記載しなければいけないものかと
推測しています。


以下を使用させて頂きました。
http://hanatyan.sakura.ne.jp/vb6/internet03.htm

WebBrowser1.Navigate "http://hanatyan.sakura.ne.jp/top.htm"
                 ↓ 変更
WebBrowser1.Navigate "https://www.msn.com/ja-jp"

テキスト形式で実行

質問
タグが表示される理由及びタグを非表示にする方法がありましたら、ご指導のほどよろしくお願いいたします。


[ □ Tree ] 返信 編集キー/

▲[ 87334 ] / ▼[ 87343 ]
■87335 / 1階層)  Re[1]: Webbrowserコントロールにつきまして
□投稿者/ WebSurfer (1485回)-(2018/05/12(Sat) 15:17:43)
No87334 (ak さん) に返信

まずは以下の情報を提供してください。

Windows Forms アプリか。(WebBrowser は WPF にもあります) 

レジストリの FEATURE_BROWSER_EMULATION は何に設定しているか。

開発環境(OS, .NET, Visual Studio のバージョンなど)。

そして、

> webBrowserコントロールでurl https://www.msn.com/ja-jpを起動しますと頭から
> タグ(window._perfMarker ・・・)が表示されます。

の「タグ」とは何かを教えてください。Windows 10 の IE11 で上記 url のサイトを見てみましたが、
何を「タグ」と言っているのか分かりませんでした。
[ 親 87334 / □ Tree ] 返信 編集キー/

▲[ 87335 ] / 返信無し
■87343 / 2階層)  Re[2]: Webbrowserコントロールにつきまして
□投稿者/ 魔界の仮面弁士 (1661回)-(2018/05/14(Mon) 11:12:18)
No87334 (ak さん) に返信
> webBrowserコントロールでurl https://www.msn.com/ja-jpを起動しますと頭から
> タグ(window._perfMarker ・・・)が表示されます。タグが文字列として取得された為、また
> タグを表示させない為にはurl側でwebBrowserに合ったソースで記載しなければいけないものかと
> 推測しています。

そのページのドコを取得したいのでしょうか?
もしもリンクを拾いたいだけなら、こんな感じで得られそうです。

Private Sub Command1_Click()
  Dim link As Object, l As Long
  l = 0
  For Each link In WebBrowser1.Document.links
    l = l + 1
    Debug.Print l, link.innerText
    Debug.Print , link.href
    Debug.Print
  Next
End Sub



> テキスト形式で実行
> 質問
> タグが表示される理由及びタグを非表示にする方法がありましたら、ご指導のほどよろしくお願いいたします。

『テキスト形式で実行』の意味が良く分かりませんが、とりあえず思いつく限りで。

Option Explicit

Private Sub Form_Load()
  WebBrowser1.Silent = True
  WebBrowser1.Navigate "https://www.msn.com/ja-jp"
End Sub

Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
''''画面に表示されているテキストが取得できれば良い場合
  'body 要素を選択状態にして、クリップボード経由で取得
  WebBrowser1.Document.body.focus
  WebBrowser1.ExecWB OLECMDID_SELECTALL, OLECMDEXECOPT_DODEFAULT
  WebBrowser1.ExecWB OLECMDID_COPY, OLECMDEXECOPT_DODEFAULT
  Text1.Text = Clipboard.GetText(vbCFText)
  Clipboard.Clear

''''選択範囲のタグやテキストを得る場合
  Dim selection As Object
  Set selection = WebBrowser1.Document.selection
  If selection.type = "Text" Then 'type プロパティは "Text", "Control", "None" のいずれか
    Dim range As Object
    Set range = WebBrowser1.Document.selection.createRange()
    Text2.Text = range.htmlText
    Text3.Text = range.Text
  End If

  '選択範囲を解除
  WebBrowser1.ExecWB OLECMDID_CLEARSELECTION, OLECMDEXECOPT_DODEFAULT

''''Body 要素の中身を、テキストだけ取得したい場合
  Text4.Text = WebBrowser1.Document.body.innerText
  
''''Body 要素のタグごと取得したい場合
  Text5.Text = WebBrowser1.Document.body.outerHTML
  
''''ページ内のすべてのタグを対象にする場合は、documentElement プロパティでルートノードを得て、
''''そこから innerText , innerHTML, outerText, outerHTML などで取得することもできる。
''''ただし TextBox だと文字数制限があるので、長いコンテンツの場合はRichTextBox を使ったほうがよい
  RichTextBox1.Text = WebBrowser1.Document.documentElement.outerHTML

''''上記をクリップボードに直接セットする場合
  Clipboard.Clear
  Clipboard.SetText WebBrowser1.Document.documentElement.outerHTML, vbCFText

''''outerHTML 等だと、HTML の解析結果がロードされることになるため、
''''空白や改行、タグの大文字小文字、"<br>" と "<br />" の違いは失われるし、
''''<script> 等で動的に生成されたコンテンツも含まれることになる。
''''もしも、サーバーから返される生の HTML をそのまま受け取りたい場合には
''''IPersistStreamInit もしくは IPersistFile を使った方が良いが、
''''そのためには追加の参照設定が必要になってしまう。
''
'  Dim pf As IPersistFile
'  Set pf = WebBrowser1.Document
'  pf.Save "C:\temp\example.html", True
'
''
'  Dim ps As IPersistStreamInit
'  Set ps = WebBrowser1.Document
'  Dim stm As ADODB.Stream
'  Set stm = New ADODB.Stream
'  stm.Type = adTypeBinary
'  stm.Open
'  ps.save stm, True
'  stm.Flush
'  stm.position = 0
'  stm.Type = adTypeText
'  stm.Charset = "_autodetect" '文字コード自動判別
'  RichTextBox2.Text = stm.ReadText(adReadAll)
'  stm.Close
'
''''追加の参照設定なしで IPersistFile を呼び出してみた場合のサンプル
'  http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200310/03100017.txt
End Sub
[ 親 87334 / □ Tree ] 返信 編集キー/

▲[ 87334 ] / 返信無し
■87336 / 1階層)  Re[1]: Webbrowserコントロールにつきまして
□投稿者/ WebSurfer (1486回)-(2018/05/12(Sat) 16:16:55)
No87334 (ak さん) に返信

【追伸】

言ってることが分かったような気がします。

WebBrowser.Document.Body.InnerHtml で文字列を取得すると、

"\n <script>window._perfMarker && window._perfMarker(\"TimeToBodyStart\");</script>\n\n <script>\n require([\"headData\", \"pageInstance\", \"mediator\"], function (headData, pageInstance, mediator)\n {\n ..."

WebBrowser.Document.Body.InnerText で文字列を取得すると 、

"window._perfMarker && window._perfMarker(\"TimeToBodyStart\"); require([\"headData\", \"pageInstance\", \"mediator\"], function (headData, pageInstance, mediator) { ..."

という文字列になる。そういう訳の分からない文字列は表示したくなくて、日本語として読んで
意味の分かる文章のみ表示したい・・・と言っているのですよね?

html ソースを見てことがあります? なければ一度見てください。body 要素の innerHTML や
innerText 取得するのであればそれは当然の結果だと分かると思います。

取得したい部分がどこがか分かりませんが、何にせよ、body 全体ではなく、取得したい部分の
要素を探して、その innerText を取得する他ないと思います。


[ 親 87334 / □ Tree ] 返信 編集キー/

▲[ 87334 ] / ▼[ 87338 ]
■87337 / 1階層)  Re[1]: Webbrowserコントロールにつきまして
□投稿者/ WebSurfer (1487回)-(2018/05/12(Sat) 16:40:56)
No87334 (ak さん) に返信

【追伸2】

今頃気づいて何ですが VB6 の話だったのですね。上の私のレスに書いた文字列の取得結果は
Windows Forms アプリ用の .NET の WebBrowser でのものです。

ですが、質問者さんが VB6 の WebBrowser の InnerText, InnerBody での文字列の取得結果が、
上の私のレスと同じ結果になるのであれば、

> body 要素の innerHTML や innerText 取得するのであればそれは当然の結果だと分かると思
> います。

> 取得したい部分がどこがか分かりませんが、何にせよ、body 全体ではなく、取得したい部分の
> 要素を探して、その innerText を取得する他ないと思います。

・・・は同様に当てはまると思います。
[ 親 87334 / □ Tree ] 返信 編集キー/

▲[ 87337 ] / ▼[ 87339 ]
■87338 / 2階層)  Re[2]: Webbrowserコントロールにつきまして
□投稿者/ ak (37回)-(2018/05/12(Sat) 19:00:05)
WebSurfer さん

返答して頂きまして、ありごとうございました。

記載しました下記に情報不足があり、申し訳ありませんでした。
本文 (質問の場合は、開発環境・使用言語のバージョンなどを最初に書いてください)
> 開発環境(OS, .NET, Visual Studio のバージョンなど)。
OSは Windows 10です。バージョンはIE11です。
開発環境 Microsoft Visual Basic 6.0

>レジストリの FEATURE_BROWSER_EMULATION は何に設定しているか。
10進数[9999]

>【追伸】
>言ってることが分かったような気がします。
ありがとう、ございます。

>WebBrowser.Document.Body.InnerHtml で文字列を取得すると、

>"\n <script>window._perfMarker && window._perfMarker(\"TimeToBodyStart\");</script>\n\n <script>\n require([\"headData\", \"pageInstance\", \"mediator\"], function (headData, pageInstance, mediator)\n {\n ..."

>WebBrowser.Document.Body.InnerText で文字列を取得すると 、

>"window._perfMarker && window._perfMarker(\"TimeToBodyStart\"); require([\"headData\", \"pageInstance\", \"mediator\"], function (headData, pageInstance, mediator) { ..."

>という文字列になる。そういう訳の分からない文字列は表示したくなくて、日本語として読んで
>意味の分かる文章のみ表示したい・・・と言っているのですよね?
はい、その通りです。
>html ソースを見てことがあります? なければ一度見てください。body 要素の innerHTML や
>innerText 取得するのであればそれは当然の結果だと分かると思います。

>取得したい部分がどこがか分かりませんが、何にせよ、body 全体ではなく、取得したい部分の
>要素を探して、その innerText を取得する他ないと思います。
はい、分かりました。

>【追伸2】

>今頃気づいて何ですが VB6 の話だったのですね。上の私のレスに書いた文字列の取得結果は
>Windows Forms アプリ用の .NET の WebBrowser でのものです。
はい、分かりました。
>ですが、質問者さんが VB6 の WebBrowser の InnerText, InnerBody での文字列の取得結果が、
>上の私のレスと同じ結果になるのであれば、
同じ結果になります。
>> body 要素の innerHTML や innerText 取得するのであればそれは当然の結果だと分かると思
>> います。

>> 取得したい部分がどこがか分かりませんが、何にせよ、body 全体ではなく、取得したい部分の
>> 要素を探して、その innerText を取得する他ないと思います。

>・・・は同様に当てはまると思います。
はい、分かりました。

WebBrowserコントロールの使用では文字列を指定してもurlからの取得にもよりますが全て文字列の取得は
できないことが分かりました。Webbrowserコントロールの使い方につきましてはまだ理解できていませんので
【追伸】【追伸2】の、ご指摘を参考にして調べてみたいと思います。

幾度に渡り、ご指導をして頂きまして感謝申し上げます。本当にありがとうがざいました。





解決済み
[ 親 87334 / □ Tree ] 返信 編集キー/

▲[ 87338 ] / ▼[ 87340 ]
■87339 / 3階層)  Re[3]: Webbrowserコントロールにつきまして
□投稿者/ WebSurfer (1488回)-(2018/05/12(Sat) 20:14:31)
No87338 (ak さん) に返信

> 全て文字列の取得はできないことが分かりました。

誤解があるのでは?

WebBrowser.Document.Body.InnerHtml では body 要素の中のすべての文字列が取得できます。

WebBrowser.Document.Body.InnerText でも、<script> というようなタグの中身のすべての
文字列が取得できます。

その中には間違いなく質問者さんが取得したい文字列が含まれています。
解決済み
[ 親 87334 / □ Tree ] 返信 編集キー/

▲[ 87339 ] / ▼[ 87341 ]
■87340 / 4階層)  Webbrowserコントロールにつきまして
□投稿者/ ak (38回)-(2018/05/12(Sat) 22:22:44)
2018/05/12(Sat) 22:52:45 編集(投稿者)

WebSurfer さん

返信して頂きましてありがとうございました。

>> 全て文字列の取得はできないことが分かりました。
>誤解があるのでは?
読み返しましたら間違っていました。済みませんでした。

実際にhttps://www.msn.com/ja-jpのバイト数を調べてみました。
-------------------------------------------------------------
テキスト形式 WebBrowser.Document.Body.InnerText (32777)バイト
html 形式   WebBrowser.Document.Body.InnerHtml (67663)バイト
WebBrowser1 範囲選択⇒コピー⇒貼り付け (19649)バイト
--------------------------------------------------------------
Webページ 範囲選択⇒コピー⇒貼り付け (20414)バイト
--------------------------------------------------------------
>WebBrowser.Document.Body.InnerHtml では body 要素の中のすべての文字列が取得できます。
>WebBrowser.Document.Body.InnerText でも、<script> というようなタグの中身のすべての
>文字列が取得できます。
>その中には間違いなく質問者さんが取得したい文字列が含まれています。
[WebBrowser1.Document.body.innerText]取得したい文字列が含まれることが実際にバイト数を調べてみて分かりました。

まだ、良く分かっていませんが
[WebBrowser1 範囲選択⇒コピー⇒貼り付け]では全ての文字列が日本語として読んで意味の分かる文字列ですが
[WebBrowser1.Document.body.innerText]では、全ての文字列が日本語として読んで意味の分かる文字列の他に今回
のような日本語として読んで意味の分からない表示が余分にされます。余分に表示されなければよいのですが
そのような仕様でしたら全ての文字列の表示が日本語として読んで意味の分かる表示にするには、WebBrowser1 を
[範囲選択⇒コピー]して読み込む方法しかないかと考えました。

以上につき、間違っていなければ、webBrowserコントロールにつきまして少しは分かりました。

お手数をお掛けしております。
[ 親 87334 / □ Tree ] 返信 編集キー/

▲[ 87340 ] / ▼[ 87342 ]
■87341 / 5階層)  Re[5]: Webbrowserコントロールにつきまして
□投稿者/ WebSurfer (1489回)-(2018/05/12(Sat) 23:20:17)
No87340 (ak さん) に返信

前に言いましたけど、html ソースを見ましたか?

見てないのでは? 見てればそういう発言は出ないと思うのですが・・・

html ソース(css, javascript を含む)が Web サーバーからブラウザに送信されるものです。

ブラウザ(WebBrowser を含む)が画面上で表示しているものとは違います。

html, css, javascript について基本的な知識を勉強してください。

それらはここのような掲示板で説明できることではないです。
[ 親 87334 / □ Tree ] 返信 編集キー/

▲[ 87341 ] / ▼[ 87352 ]
■87342 / 6階層)  Re[6]: Webbrowserコントロールにつきまして
□投稿者/ ak (39回)-(2018/05/12(Sat) 23:47:25)
WebSurfer さん

>html, css, javascript について基本的な知識を勉強してください。
はい、分かりました。

> それらはここのような掲示板で説明できることではないです。
はい、分かりました。基本的な知識ありませんので解決とさせてもらいます。

度重ね、貴重な時間を割いてご返答してして下さいまして、ありがとうございました。

解決済み
[ 親 87334 / □ Tree ] 返信 編集キー/

▲[ 87342 ] / 返信無し
■87352 / 7階層)  Re[7]: Webbrowserコントロールにつきまして
□投稿者/ ak (40回)-(2018/05/14(Mon) 16:33:32)
魔界の仮面弁士 さん

返信して頂きまして、ありがとうございました。

> 『テキスト形式で実行』の意味が良く分かりませんが、とりあえず思いつく限りで。
質問に説明不足等、不備がありました。

>Option Explicit

>Private Sub Form_Load()
>  WebBrowser1.Silent = True
>  WebBrowser1.Navigate "https://www.msn.com/ja-jp"
>End Sub

>Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
>''''画面に表示されているテキストが取得できれば良い場合
>  'body 要素を選択状態にして、クリップボード経由で取得
>  WebBrowser1.Document.body.focus
>  WebBrowser1.ExecWB OLECMDID_SELECTALL, OLECMDEXECOPT_DODEFAULT
>  WebBrowser1.ExecWB OLECMDID_COPY, OLECMDEXECOPT_DODEFAULT
>  Text1.Text = Clipboard.GetText(vbCFText)
>  Clipboard.Clear
>    ・
>    ・
>    ・
>End Sub

Webページの範囲選択⇒コピーによる文字列の取得とテキスト形式(WebBrowser1.Document.body.innerText)
の実行による文字列の取得は全く同じ文字列になり希望のものとなりました。
>WebBrowser1.Document.body.focus
>WebBrowser1.ExecWB OLECMDID_SELECTALL, OLECMDEXECOPT_DODEFAULT(全てを選択)
>WebBrowser1.ExecWB OLECMDID_COPY, OLECMDEXECOPT_DODEFAULT (コピー)
大変、勉強になりました。そのまま利用させてもらいます。

その他(Text2.Text〜Text5.Text)も勉強になりました。
>''''ただし TextBox だと文字数制限があるので、長いコンテンツの場合はRichTextBox を使ったほうがよい
> RichTextBox1.Text = WebBrowser1.Document.documentElement.outerHTML
はい、分かりました。

前回(#87290 2018/05/07)[テキストボックスの自動改行につきまして]の、ご回答して頂きまして、ありがとうございました。
今回も、ご回答して頂き、なんとお礼を申し上げればよいのか、言葉もありません。本当にありがとうございました。

解決済み
[ 親 87334 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -