MSXML2を使用してサイトのタイトルを取得する方法

このQ&Aのポイント
  • MSXML2を使用してサイトのタイトルを取得する方法について教えてください。
  • InternetExplorerを使用した方法ではなく、MSXML2を使用してサイトのタイトルを取得する方法が知りたいです。
  • 具体的なコードも教えていただけると助かります。
回答を見る
  • ベストアンサー

MSXML2で、サイトのタイトルを取得したい

アクセスvbaです。 InternetExplorerの方法だと、 **************************************************** Sub Sample1() Dim ObjIE As InternetExplorer Set ObjIE = CreateObject("InternetExplorer.Application") ObjIE.Navigate "http://www.yahoo.co.jp/" ObjIE.Visible = True Do While ObjIE.Busy = True DoEvents Loop Do While ObjIE.Document.ReadyState <> "complete" DoEvents Loop Debug.Print ObjIE.Document.Title Debug.Print ObjIE.LocationName ' 同じ ObjIE.Quit Set ObjIE = Nothing End Sub **************************************************** で、該当のサイトのタイトルを取得できるのですが、 これではなく、 **************************************************** Sub Sample2() Dim objMSXML2 As Object Dim myObj As Object Dim myAll As Variant Set objMSXML2 = CreateObject("MSXML2.XMLHTTP") objMSXML2.Open "GET", "http://www.yahoo.co.jp/", False objMSXML2.Send myAll = objMSXML2.responseText 'ソースを抜き出す ’タイトル取得 Set objMSXML2 = Nothing End Sub **************************************************** の方法で、サイトのタイトルを取得したいのですが、 可能でしょうか? コードをご教授ください。よろしくお願いします。

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

  • ベストアンサー
回答No.1

こんにちは。 まず、ご承知とは思いますが一応、 XMLHTTPでもWinHttpRequestでも、 直接的に「サイトのタイトルを取得」する方法はないので、 「MSXML2で」ということだと「可能でしょうか?」、noです。 htmlソースをMSHTML.HTMLDocumentに放り込んでからgetElementsで取得する、 なんて筋書き等も、試してはみましたが、私の方では、うまく行かなかったです。 出来るのかも知れないけれど、結構手数が多そうな予感もあり、悩んだ末、 ベタでシンプルな形で文字列を抜き出してみました。 これで万全、とは言えないのかも知れませんが、 <head><title></title></head>という絶対的な属性を扱う分には、 案外まっとうなやり口のような気がしています。 検証に少しは時間かけた方が良さそうですけれど、 身の回りのWebページ達については、一応「サイトのタイトルを取得」出来ていました。 あまりにもベタな方法なので、ふざけて見えるかも知れませんが、 日常的に、htmlソースからの抜出しには、 InStr()関数やRegExpを真面目に使うことも多いです。 RegExpで書いた方が見栄えは良くなるとは思いますし、 IgnoreCase = True を指定した方が、堅実な漢字はしますが、 シンプルな方がいいかな?と。 もし、お望みと違う内容になっていましたらすみません。 XMLHTTPは殆ど使ったことないので、WinHttpRequestで書いていますが、 記述内容としては共通なので、できれば参照設定してから試してみて下さい。 (または後半の「<Title>取得」の部分だけ、そちらに書き加えるなど、、、。) (タグが見つからない場合?の、エラー処理は省いています。) **************************************************** ' ' 参照設定[Microsoft WinHTTP Services, version 5.1] / WinHttp Sub Re8982750w() ' WinHttpRequest 版 ' ' htmlソース取得 Dim oWinReq As WinHttp.WinHttpRequest Dim myAll As Variant   Set oWinReq = New WinHttp.WinHttpRequest '  Set oWinReq = CreateObject("WinHttp.WinHttpRequest.5.1")   oWinReq.Open "GET", "http://www.yahoo.co.jp/", False   oWinReq.Send   myAll = oWinReq.responseText ' htmlソースを抜き出す   oWinReq.abort   Set oWinReq = Nothing ' ' <Title>取得 Dim nPosEndTag As Long Dim nPosStartTag As Long   nPosEndTag = InStr(1, myAll, "</head>", vbTextCompare)   nPosEndTag = InStrRev(myAll, "</title>", nPosEndTag, vbTextCompare)   nPosStartTag = InStrRev(myAll, "<title>", nPosEndTag, vbTextCompare)   Debug.Print "■"; Mid$(myAll, nPosStartTag + 7, nPosEndTag - nPosStartTag - 7); "■" End Sub ****************************************************

myatiztlth
質問者

お礼

ありがとうございました。

関連するQ&A

  • サイトタイトルを取得するマクロを最速化

    下記のマクロは、サイトタイトルを取得するマクロです。 このマクロで、サイトタイトルを取得していましたが、 5秒に1つくらいのペースなので、もっとスピードを上げたいと思っています。 最速化するには、どこか修正した方が良い箇所はあるでしょうか? また、変更するべき設定などもあったりするでしょうか? よろしくお願いいたします Sub sample() Dim Carea As Range Set Carea = Selection If Carea(1).Value = "" Then Exit Sub Dim Tcel As Range Dim ObjIE As Object Set ObjIE = CreateObject("InternetExplorer.Application") For Each Tcel In Carea ObjIE.Navigate Tcel.Value Do While ObjIE.Busy = True Or ObjIE.readyState <> 4 DoEvents Loop Tcel.Offset(, 1) = ObjIE.document.Title Next ObjIE.Quit Set ObjIE = Nothing End Sub

  • サイトのソースのsubmitボタンの数を取得したい

    サイトのソースのsubmitボタンの数を取得したいのですが Sub test() Dim objIE As InternetExplorer Dim MyRow As Long Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate "http://www.coneco.net/" Do While objIE.Busy = True Or objIE.ReadyState <> 4 DoEvents Loop Debug.Print objIE.Document.all.tags("input").Type("submit").Count Set objIE = Nothing End Sub だとうまく動きません。 どう、変更すればよろしいですか?

  • 現在表示されているURLを取得したいのですが

    Sub test1() Dim objIE As InternetExplorer Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate "http://www.goo.ne.jp/" Do While objIE.Busy = True Or objIE.ReadyState <> 4 DoEvents Loop Debug.Print objIE.Navigate Set objIE = Nothing End Sub //////////////////////////////////////////////// をやろうとすると、 Debug.Print objIE.Navigate の部分で、「引数は省略できません。」とエラーになります。 どう修正すればいいか教えてください。 ("http://www.goo.ne.jp/"はダミーです)

  • 「オブジェクトの破棄」と「メモリの解放」は同じ意味

    「オブジェクトの破棄」と「メモリの解放」は同じ意味ですか? ********************************* Sub Sample1() Dim objIE As Object Dim buf As String Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.navigate "http://oshiete.goo.ne.jp/" Do While objIE.busy DoEvents Loop Do While objIE.Document.readyState <> "complete" DoEvents Loop Set objIE = Nothing End Sub ********************************* の場合の「Set objIE = Nothing」は、 「オブジェクトの破棄」でしょうか? 「メモリの解放」でしょうか? どちらでもありますか? ご回答よろしくお願いします。

  • 住所を入力し、検索ボタンをクリックしたいのですが

    グーグルマップを開き 住所を入力し、検索ボタンをクリックしたいのですが それをvbaで実現可能でしょうか? Dim objIE As Object Sub Sample() Dim myObj As Object Set objIE = CreateObject("InternetExplorer.application") objIE.Visible = True objIE.navigate "https://www.google.co.jp/maps" Do While objIE.Busy = True DoEvents Loop Do While objIE.document.readyState <> "complete" DoEvents Loop Set objIE = Nothing End Sub はできたのですが 「グーグルマップを検索する」が ソース内で見当たらないし さらに 検索ボタンもソース内で探せません。 グーグルの検索窓に「東京都千代田区丸の内1-9-1」 トイレたいのですが VBAでどうすればいいのでしょうか?

  • VBAでソースの一番上から取得するには?

    Sub 取得() Dim objIE As Object Set objIE = CreateObject("InternetExplorer.Application") objIE.Navigate "http://www.google.co.jp/" objIE.Visible = True Do While objIE.Busy = True DoEvents Loop Debug.Print objIE.Document.body.innerHTML Set objIE = Nothing End Sub これだと、 <DIVstyle="DISPLAY:none"id=cst></DIV><TEXTAREAstyle="DISPLAY:none" id=csi></TEXTAREA><SCRIPT>if(google.j.b)document.body.style.visibility='hidden';</SCRIPT> からしか取得されないのですが、 実際のソースを見ると <!doctype html><html itemscope="itemscope" itemtype="http://schema.org/WebPage"> で始まってます。 VBAソースのてっぺんから取得する方法を教えてください。 innerHTML以外を使うのでしょうか?

  • 「ページが表示されました」まで取得したい

    IEを立ち上げてステータスバーのテキストを取得して、 「ページが表示されました」を取得出来たら、次のコードへ進みたいのですが、 下のコードでStatusTexttを書き出しても「ページが表示されました」まで取得できません。 Sub test() Dim objIE As InternetExplorer Dim i As Long Set objIE = CreateObject("InternetExplorer.Application") objIE.Navigate "http://www.goo.ne.jp/" objIE.Visible = True Workbooks.Add Cells(1, 1) = objIE.StatusText i = 2 Do While objIE.Busy = True Or objIE.ReadyState <> 4 DoEvents Cells(i, 1) = objIE.StatusText i = i + 1 Loop Cells(i, 1) = objIE.StatusText Set objIE = Nothing End Sub Do While objIE.Busy = True Or objIE.ReadyState <> 4 ここら辺のコードを弄ればいいような気がしますが、うまくいきません。 ご回答よろしくお願いします。

  • IE操作 StatusTextの文字を取得したい

    現在IE9を使っています。 IE8なら、添付画像の赤で囲った部分に "ページが表示されました"と表示されますが、IE9では表示されません。 ここに文字を表示し、文字を取得するにはどうすればいいでしょうか? ************************************* Sub Sample() Dim objIE As InternetExplorer Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate "http://www.goo.ne.jp/" objIE.StatusText = True '意味ないっぽい Debug.Print objIE.StatusText objIE.Quit Set objIE = Nothing End Sub ************************************* これでは取得されませんでした。 Do DoEvents Loop Until objIE.StatusText = "ページが表示されました" のように、ページが表示されたら、次のコードに進む・・・とやりたいです。

  • 「地図」で検索するにはどういう操作をすればいいので

    ヤフーのトップページから 値を入れて検索を押すまではできるのですが 「ウェブ」ではなく「地図」で検索するにはどういう操作をすればいいのでしょうか? Sub yahoo() Dim objIE As Object Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate "http://www.yahoo.co.jp/" Do While objIE.Busy = True DoEvents Loop Do While objIE.Document.ReadyState <> "complete" DoEvents Loop objIE.Document.forms(0).elements("p").Value = "東京" '‘「地図」をクリックする操作をしたい objIE.Document.forms(0).submit Set objIE = Nothing End Sub 宜しくお願いいたします。

  • DoEvents

    VBSでDoEventsは使えないのでしょうか? *************************** Dim ObjIE dim i Set ObjIE = CreateObject("InternetExplorer.Application") ObjIE.Navigate "http://oshiete.goo.ne.jp/" ObjIE.Visible = True Do While ObjIE.Busy = True DoEvents Loop Do While ObjIE.Document.ReadyState <> "complete" DoEvents Loop Set ObjIE = Nothing *************************** だと、エラーになりました。 Wscript.sleep 3000 ならエラーにならずにコードは動きました。 VBAならDoEventsは使えるのに VBSで使えない理由を教えてください。

専門家に質問してみよう