• 締切済み

外部のウェブサイトの記事タイトルを取得する方法

例えば http://sankei.jp.msn.com/flash/newslist/flash-n1.htm のようなニュース(ブログでも)サイトのタイトルだけをエクセルで取得したいと思っています。 純粋にタイトルの文字だけが欲しいのですが、マクロなどで試してみても取り込めません。 エクセルの外部データの取り込みも実行してみましたが、できませんでした。 どなたか教えてください!

みんなの回答

  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.3

#2 の方が書かれていらっしゃる RSSフィードを使う方法が簡単ですし 比較的汎用性も高いコードができると思います。 その一例を書くと 次のような感じになります↓。 Sub GetRSSNewsTitle() 'RSSフィードページのURL指定 RSSURL = InputBox("RSSフィードのURLを入力してください↓", _ "ニュースタイトルを取得", _ "h" & "ttp://sankei.jp.msn.com/rss/news/flash.xml") '「キャンセル」されたらこのプロシージャを抜ける If RSSURL = "" Then Exit Sub 'MSXML2.XMLHTTP オブジェクトの生成 Dim XMLObj As Object Set XMLObj = CreateObject("MSXML2.XMLHTTP") '指定されたRSSフィードをロード XMLObj.Open "GET", RSSURL, False XMLObj.Send ' ロード待ち Do While XMLObj.readyState <> 4 Loop 'XMLデータを取得 XMLData = XMLObj.responseText 'データを「<title>」で分割した配列を作成 TitleArray = Split(XMLData, "<title>") 'セル「A1」にタイトル表示 Cells(1, 1).Value = "↓★ニュースのタイトル★↓" '配列の要素数分ループ(1はページタイトルのため2からループ) For i = 2 To UBound(TitleArray) '各要素を「</title>」で分割した最前要素をセル「A2」~「A○」に表示 Cells(i, 1).Value = Split(TitleArray(i), "</title>")(0) Next 'MSXML2.XMLHTTP オブジェクトを破棄 Set XMLObj = Nothing End Sub ※インプットボックスのデフォルト値を  "h" & "ttp://sankei.jp.msn.com/rss/news/flash.xml"  のような変な書き方にしているのは  自動リンクがかかってコピペ時に変なゴミが付いたり  URLの後半が表示省略されてしまうのを防ぐためだけです。  つまりこのQ&Aサイトの仕様への対策ですから普通は  "http://sankei.jp.msn.com/rss/news/flash.xml"  のような感じにすれば良いです。   ============================== ご質問で書かれていらっしゃる HTML の方ページ http://sankei.jp.msn.com/flash/newslist/flash-n1.htm こちらからのニュースタイトル取得も不可能ではありませんが 必要部分の抽出がややこしくなりますし また苦労して作っても汎用的なコードにはなりません。 というわけであまりお薦めはできませんが 一応こちらの一例も書いておくと 次のような感じになります↓。 Sub GetHtmlNewsTitle() 'ニュースページのURL指定 NewsURL = InputBox("ニュースページのURLを入力してください↓", _ "ニュースタイトルを取得", _ "h" & "ttp://sankei.jp.msn.com/flash/newslist/flash-n1.htm") '「キャンセル」されたらこのプロシージャを抜ける If NewsURL = "" Then Exit Sub 'InternetExplorer.Application オブジェクトの生成 Dim IEObj As Object Set IEObj = CreateObject("InternetExplorer.Application") '指定されたページをロード IEObj.Visible = False IEObj.Navigate (NewsURL) ' ロード待ち Do While IEObj.Busy Or IEObj.ReadyState <> 4 Loop '<body>内の HTML の文字列を取得 HtmlStr = IEObj.Document.body.innerHTML '必要な部分の文字列を取得 NeedStr = Split(Split(HtmlStr, "id=MainContent")(1), "class=pagerModule")(0) '「.htm">」で分割した配列を作成 NeedArray = Split(NeedStr, ".htm"">") 'セル「A1」にタイトル表示 Cells(1, 1).Value = "↓★ニュースのタイトル★↓" '配列の要素数分ループ For i = 1 To UBound(NeedArray) '各要素を「</A>」で分割した最前要素をセル「A2」~「A○」に表示 Cells(i + 1, 1).Value = Split(NeedArray(i), "</A>")(0) Next 'InternetExplorer.Application オブジェクトを破棄 Set IEObj = Nothing End Sub ※サーバの動作が不安定でエラーが出ることがあるかもしれません。 ※HtmlStr = IEObj.Document.body.innerHTML  これ以降の部分は  特に一行一行何をしているのかちゃんと理解した上で  表示させるページによってデータを解析して考え直さないと  他のサイトなどではこのまま使うことはできません。  また別のサイトなどでは  抽出不可能なページも出てくる可能性もあります。 ※実際の HTML と Excel で取得できる HTML との間には  違う点が多々見られます。  他サイトや他ページのデータを解析する場合は  Debug.Print などを用いて  Excel で取得されているデータを確認しながら  解析して行く必要があります。 ・以上の参考URL 「VBAでWebページを取得する方法」 http://www.crystal-creation.com/software/technical-information/programming/vba/sample/web.htm 「Office TANAKA - Excel VBA Tips[Split関数で文字列を区切る]」 http://officetanaka.net/excel/vba/tips/tips62.htm

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.2

マクロとかHTML構文熟知してないので 参考になるかはわかりません 記載してあるURLであれば RSSフィードが流れていますので それ取り込んで Title タグのみ抽出すれば可能かと思います RSSフィードは  http://sankei.jp.msn.com/rss/news/flash.xml 他のサイトでも自分でRSSフィード加工するなどの手順を踏めば可能です サイトで対応してない場合 RSSフィードを自分でどう作るんだって話だと 自分の場合 Yahoo Pipes サービス使って作ったりしてます 真面目にやるならそれら構文をちゃんと自分で解析できる知識が必要かと思います

  • jsktok
  • ベストアンサー率68% (44/64)
回答No.1

ご希望のものに近いものがありましたので、参考URLに書かせていただきました。

参考URL:
http://www.upken.jp/kb/WebServerTest.html
hjislD
質問者

お礼

jsktokさん 回答ありがとうございました。 すみません、私の説明の仕方に問題がありまして、ページ上の<title>ではなく、 ページ内にあるリンクのタイトルを取得したいと思っております。 でもリンクを貼っていただいたサイト、非常に参考になりました。 今後使わせていただこうと思います!

関連するQ&A