• ベストアンサー

VBAでハイパーリンクを抽出することについて

VBAやHTMLに詳しい人に質問です。 webサイトからハイパーリンクの値を取得するVBAコードを10年近く前に書いたのですが、全く覚えていないので困っています。 例えば下記の南関競馬の年間日程表のページから、各日程のハイパーリンクの値(4月1日なら /program/20140401200101.do )を抜き出し1つの列に並べて表示するという動きです。実行すると画像のようになります。 https://www.nankankeiba.com/calendar/201404.do しかし、現在は南関競馬は大幅リニューアルしたらしく、HTMLの仕様も変わったようなので、上手く動きません。 下はコードの一部分ですが多分ですが、サイトがリニューアルした結果、下記の行での指定("EM") では上手くアクセスできないのかと思います。HTMLも全く知識がないので、詳しい方いましたら、アドバイスお願いします。 Set Doc = ie.document Set chNodes = Doc.getElementsByTagName("EM") 'getElementsByTagName On Error Resume Next For Each chNode In chNodes Set docPart = New HTMLDocument docPart.write chNode.outerHTML Set chNodes1 = docPart.getElementsByTagName("A") myCell.Value = Replace(chNodes1(0).href, "about:", "") Set myCell = myCell.Offset(1, 0) Next chNode

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

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

ちょっとの改変でいけそうな気はしますね。二行目のEMをaに変えたら良いんでないでしょうか。 そうすると、コンテンツのaタグが配列で取れるので、あとはループ無い処理を書き換えて、先頭の文字が「/program/」となっているものだけをセルに書き込めばいいんじゃないでしょうか。 VBAがある程度は理解しているという想定で回答してます。部分的なプログラムであることと、こちらはMacなので、動かせてません。 aタグとは、下のコンテンツの一部分ですが、a hrefというのがaタグで、これが配列で取れますが、/bangumi/20142001.doだとか、他のものも含まれるので、先頭が/program/のものだけを書き込めば良い想定です。 <a href="/program/20140401200101.do" class="nk23_c-table21__icon is-style1"> <img src="/assets/images/common/icon/icon_moon1.svg" alt="ナイター開催"> </a> <a href="/bangumi/20142001.do" class="nk23_c-table21__icon is-style1">番組</a> Set Doc = ie.document Set chNodes = Doc.getElementsByTagName("a") 'getElementsByTagName On Error Resume Next For Each chNode In chNodes

mzakom
質問者

お礼

仰る通りaタグにすると上手く行きました。 ご丁寧にありがとうございます。助かりました。

Powered by GRATICA
全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.1

サイトの利用規約でスクレイピングは許可されていますか?知らなかったでは済まされないので、↓は気をつけた方が良いです。禁止してなくても、短い間隔でスクレイピングすると、サーバーに負荷がかかるので、攻撃と見なされる可能性もありますね。 スクレイピングを行いたいWebサイトがあれば、まずは利用規約を確認するのが基本の流れです。 利用規約にスクレイピング禁止だと明記してある場合、違反になり最悪のケースでは損害賠償を請求される恐れがあります。 問題無いのであれば、親切な人がコードを提供してくれる可能性はあります。

mzakom
質問者

補足

ご忠告ありがとうございます。 サイト利用の規約を読んだところ、スクレイピングやデータマイニング等の禁止と書いてる項目はなかったので大丈夫そうです。 1日1回取り込めば、その日は読み込むことないのでサイトへの負荷の面でも大丈夫かと

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VBAでIEのページを(メニュー選択)進める

    エクセルのVBAでIEのページを(メニュー選択)進める件ですが Dim tag As String Dim objtag As Object in_str = "新しく記事を書く" tag = "li" Set objtag = doc.getElementsByName(tag)(0) For Each objtag In IE.document.getElementsByTagName(tag)   If InStr(objtag.outerHTML, in_str) > 0 Then    Exit For   End If Next Debug.Print objtag.outerHTML objtag.Click For は 機能していて、Debug は <LI><A href="?mode=editor&amp;process=new">新しく記事を書く</A> で 止まっています。 で、叩く方法は?? Click が機能しないのですが objtag. の 後に お助け文字が全く出ませんので、行き詰りました。

  • VBAを使ってHTMLソースから特定の文字列を抽出

    ExcelでVBAを使ってHTMLソースから特定のデータを抽出したのですが、VBAは浅学なのでアドバイスを頂きたいです。 例えば、ここサイトの「 http://www.nankankeiba.com/calendar/201304.do 」 <em></em>タグ内の<a href="URL">のURLだけを取得して並べたいのですが、可能でしょうか。 この部分。(http://uproda.2ch-library.com/799465NHT/lib799465.jpg) ここ辺りが参考になりそうなのですが、<em></em>タグ内に限定する方法がわかりません。詳しい方いましたら、アドバイスよろしくお願いします。 http://okwave.jp/qa/q5919101.html 理想としてはこんな感じで取り出せるようにしたいです。(「program/20130407200101.do」の部分だけでも良い) http://uproda.2ch-library.com/7995052y7/lib799505.jpg

  • VBAを使ってHTMLソースから特定の文字を抽出2

    前回ExcelでVBAを使って「http://www.nankankeiba.com/calendar/201204.do」のサイトからHTMLソースから<em></em>タグ内の<a href="URL">のURL情報だけを抽出するコードを教えて頂きました。 そこで、取り込んだデータの更に下に「http://www.nankankeiba.com/calendar/201210.do」からも同じように<em></em>タグ内のURLデータを取得して表示したいのですが、ページ移動しても同じ情報を取得したり上手くいかないのでアドバイス頂けないでしょうかm(_ _)m 上のURLだけを取り込むコードはこちらになります。 http://uproda.2ch-library.com/800072670/lib800072.txt イメージとしてこの様にしたいです。 http://uproda.2ch-library.com/800071Xz0/lib800071.jpg

  • VBAのオブジェクト変数について

    人に教えなければいけないことなので、、、 困っています。 あるVBAのテキストを見て、そのテキストをそのまま入力しても実行できません。 (条件としては、Book1.xlsとBook2.xlsというファイルを開いた状態で、Book1.xlsのほうに、以下のモジュールを入力します。) Sub Set1() Dim myBook As Workbook Dim mySheet As Worksheet Dim myCell As Range Set myWBook = Workbooks("Book2.xls") Set myWSheet = Worksheets("Sheet2") Set myCell = Range("A1:D10") myWBook.Activate myWSheet.Activate myCell.Value = "ABC" End Sub これを実行すると、アクティブな状態のファイルにしか、値"ABC"が入ってこないのです。テキストでは、Book2.xlsのSheet2のA1:D10に値"ABC"が入ってくると言っていますが、Book1.xlsに値が入ってしまったりします。 長くなってしまってすみません。 もちろん、他の方法で実現することができるのはわかるのですが、なぜこのコードが実行できないのかがわかりません。 理由を教えていただけたら・・・と思います。 よろしくお願いいたします。

  • VBAのハイパーリンクにつきまして

    以前に質問をさせていただき、こちらでベストアンサーを決定した後に急きょ変更があったところがあり、わからなくなってしまいこちらに戻ってきた次第です。 http://okwave.jp/qa/q8743521.html にて質問をさせていただきました内容について、以下のVBAで解決できております。 しかし、抽出したファイル名にハイパーリンクが欲しいという要望を受けてしまいました。 ハイパーリンクのVBAについていろいろ調べましたが、この記述方法に追加して実行する方法が全く分かりませんでした。 お分かりになる方がいましたら、この内容にハイパーリンクをつける方法をお教えいただけますでしょうか。よろしくお願いいたします。 Sub Macro1() Dim i As Long Dim myPath As String, Flnm As String ReDim Flnmfp(0) As String Dim WS1 As worksheet Set WS1=ThisWorkbook.sheets("sheet1") myPath="望みのフォルダパスを入力" Call fpFileName(myPath, Flnmfp ) 'フォルダ内のファイル名取得 If Ubound(Flnmfp)=0 Then 'フォルダにファイルが無ければ終了 Exit Sub End if For i =1 to Ubound(Flnmfp) Workbooks.open filename := Flnmfp(i) Flnm=Dir(Flnmfp(i)) With Workbooks(Flnm).sheets("sheet1") WS1.Cells(2, i).value=.Range("G5").value WS1.Cells(3, i).value=.Range("G6").value WS1.Cells(4, i).value=.Range("K7").value WS1.Cells(5, i).value=CStr(.Range("G9").value) & CStr(.Range("N9").value) & CStr(.Range("P9").value) '同じ要領で望みのセルを記入する WS1.Cells(8, i).value=Flnm End with Workbooks(Flnm).close Savechanges:=False Next i End Sub Sub fpFileName(ByVal myPath As String, ByRef Flnmfp() As String) 'サブフォルダも含め全部のxlsファイル名をフルパスで取得する   Dim cnt As Long, buf As String, f As Object   buf = Dir(myPath & "\*.xls")   Do While buf <> ""     cnt = Ubound(Flnmfp) + 1 ReDim Preserve Flnmfp(cnt)     Flnmfp(cnt)= myPath & "\" & buf     buf = Dir()   Loop   With CreateObject("Scripting.FileSystemObject")     For Each f In .GetFolder(myPath).SubFolders       Call fpFileName(f.Path, Flnmfp)     Next f   End With End Sub

  • VBAでのIE操作で、ENTERキーが押せません

    VBAでIEの操作を勉強中です。 HTMLを整形するホームページ(https://lab.syncer.jp/Tool/HTML-PrettyPrint/)です。 左側のエリアにHTMLを入力すると右側に整形されたHTMLが表示されるものです。 手動ではなんら問題ありません。 作成したVBAから操作すると、左側のエリアにHTMLは入力されますが、右側に表示されません。 入力後にENTERキーが押されれば表示されるというところまでは解っています。 解っているんですが、VBAから押せません。 どなたかご教示願います。 以下作成したVBAです。 ----------------------------------------------------------------------- Sub testIE() Dim IE As Object Dim target As String Dim wText As String target = "https://lab.syncer.jp/Tool/HTML-PrettyPrint/" wText = "<html><head><title>test</title></head><body><h1>test</h1></body></html>" Set IE = CreateObject("InternetExplorer.Application") With IE .Visible = True .Navigate target Do While .Busy = True Or .ReadyState <> 4 DoEvents Loop Do While .Document.ReadyState <> "complete" DoEvents Loop .Document.getElementsByTagName("textarea")(0).Value = wText SendKeys "{ENTER}" MsgBox .Document.getElementsByTagName("textarea")(1).Value End With End Sub

  • VBA シート内ハイパーリンク置換がうまくいかない

    お世話になります。 今、エクセルシートのセルにあるハイパーリンクの置換をVBAで行おうとしています。 ファイルサーバの移設に伴い、ファイルサーバ内に保存されているエクセルファイル内のハイパーリンクの一部置換を実施すべく、下記のとおり作ってみましたがうまく置換してくれません。。 置換したいエクセルファイルはlist_TM.txtにフルパスでリスト化しており、ファイルを開く→ハイパーリンクがあれば置換→上書き保存して閉じる の繰り返しを実行しています。 下記を実行したあと、実際にファイルを開いて置換された結果を確認すると、\\server1\tantou\Datasave\sample.xls → C:\Datasave\sample.xlsとなってしまっており、当方が所望する\\server2\kyoyu\tantou\Share\Datasave\sample.xlsになっていませんでした。原因がよくわからず質問させて頂いた次第です。 なお途中でTargetRowとTargetColumnを挟んでいますが、この2行はハイパーリンクがある行と列をちゃんと拾ってくれているかどうか確認するために入れたので、無視してい頂いていいかと思います。 お力添えの程、宜しくお願い致します。 Sub Link_OKIKAE() Dim i As Long Dim buf As String Dim AWBN As String Dim HL As Hyperlink Open "C:\temp\test\list_TM.txt" For Input As #1 Do Until EOF(1) Line Input #1, buf Workbooks.Open buf AWBN = ActiveWorkbook.Name For i = 1 To Worksheets.Count Sheets(i).Activate For Each HL In ActiveSheet.Hyperlinks TargetRow = HL.Range.Row TargetColumn = HL.Range.Column HL.Address = Replace(HL.Address, "\\server1\tantou", "\\server2\kyoyu\tantou\Share") Next HL Next i Workbooks(AWBN).Save Workbooks(AWBN).Close Loop Close #1 End Sub

  • VBAオブジェクト変数またはWithブロック変数

    Access VBAについてお教えください。 VBAを使用しています。下記のようなコードでDOMの値を取得しようと思っています。 If IsNull(IE.Document.getElementsByTagName("table").Item(1).rows(1).cells(0).innerText) Or _ IE.Document.getElementsByTagName("table").Item(1).rows(1).cells(0).innerText = "" Then stocker = "" Else stocker = IE.Document.getElementsByTagName("table").Item(1).rows(1).cells(0).innerText End If IE.Document.getElementsByTagName("table").Item(1).rows(1).cells(0).innerText)にデータがある場合は、 問題なくstockerに値をセットすることができます。 ただし、IE.Document.getElementsByTagName("table").Item(1).rows(1).cells(0).innerText)にデータ(要素)が なにも無い場合は、エラーが発生します。 「実行時エラー91;オブジェクト変数またはWithブロック変数が設定されていません」 IE.Document.getElementsByTagName("table").Item(1).rows(1).cells(0).innerText)にデータが無い場合は、NULLが 帰ってくるとサイトで見かけたので、IF文を使って回避しようと思いましたが、成功しませんでした。 何が悪いと考えられるでしょうか?

  • VBAでWebページのボタン操作ができない

    IEの操作を自動化するVBAを作っています。 色んなサイトでログイン、ログアウト、・・・など様々なボタンがあるかと思いますが、 VBAからボタン操作ができずに困っています。 例えば、gooメールのログイン画面にログインボタンがあり、ソースは <INPUT value=ログイン type=submit> です。 これに対し、VBAで以下の記述をしました。  For Each objContents In IE.document.getElementsByTagName("INPUT")   If objContents.Value = "ログイン" Then     objContents.Click '←※1     objContents.submit '←※1     Exit For   End If  Next  'ボタンは2番目のフォームの3番目の要素  IE.document.forms(1).submit '←※1  IE.document.forms(1).getElementsByTagName("input")(2).Click '←※1 しかしながら、※1の操作に何の反応もありません(ページが切りわらない) ただ、セットしていたIDとパスワードが消えました。・・・ここに何かヒントがある?? 自分はVBA以外は知識があまり無く、HTMLソースも見てみましたが、よく分かりませんでした。 まずはClickもSubmitも効かない理由が知りたいです。 (上記は一例にすぎず、色んな場面(色んなサイト)でこういった現象に遭遇するので、今後の勉強のためにも。) そしてもし上記ケースの対処法が分かる方がいらっしゃればご教示いただければ幸いです。 よろしくお願いいたします。

  • <pre>タグ内のテキストを取得 エクセル VBA

    HTML文書で以下のようになっているテキストをエクセルVBAで取得しようと思います。 <pre class="fontsize3"><tt> テキスト </tt></pre> 以下のコードを書きましたが、失敗しています。 Dim htdoc As HTMLDocument Set htdoc = ie.Document Cells(1,1) = htdoc.getElementsByTagName("pre")(0).innerText 何がまちがっているのでしょうか。

このQ&Aのポイント
  • インターネット環境に関して、自宅のWi-Fiを速くするための設定方法を教えてください。
  • また、Wi-Fiがたまに切れることについての対処法も知りたいです。
  • この記事では、ASUSのルーターを使用したWi-Fiの最適な設定方法や、Wi-Fiが切れる原因と解決策について詳しく解説します。
回答を見る