質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.11%

ExcelVBAにてMSXML2.XMLHTTPを用いたHTMLソース取得に関して

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,147

score 23

URLからMSXML2.XMLHTTPを用いてHTMLソースの取得するマクロを現在作成しています。

取得部分のつくりは以下のようになっております。
(必要最低限の記載になっております。)

Dim buf As String
Set Http = CreateObject("MSXML2.XMLHTTP")
Http.Open "GET", URL, False
Http.Send
buf = StrConv(Http.responseBody, vbUnicode)

上のようなコードでURLを取得しているのですが、
特定のサイト(URL)で正しく取得されないことがあります。

正しく取得できているかいないかの比較はChromeの「ページのソースを表示」から
ダウンロードしたものと比較して判断しています。
大体のURLではきれいに一致しているのですが
一部まったく違う形で取得されてしまい困っています。

どのように違うか詳細を記載できず大変申し訳ございません。
ただ差異の内容としては全く取得できないのではなく、
bodyタグの中身が取得されていなかったり、そもそも最初の記述が
Chromeでは「<!DOCTYPE html>」などから始まっているのに対して
自分が作成してたマクロでは「<?xml version="1.0" encoding="shift_jis"?>」のように
取得されていて全く異なる形で取得されていました。

何か原因がわかる方はいますでしょうか。
Html4かHtml5かで違うか考えたのですがそうでもなさそうなので
何かわかる方がいましたらお願いいたします。

@追記 2019/10/7
どのような状況かわかりやすくするため実際のソースを一部情報を隠して記載します。
情報を隠すため「*」を入れとても分かりにくくなっているかと思われますがご了承ください。

・Chromeから取得したソース
→そのままです。Chromeからソースの表示で取得したものになります。
長いため色々と省略しています。

<!DOCTYPE html>
<html lang="ja">
<head prefix="*****">
<meta charset="Shift_JIS"/>
<meta http-equiv="***" content="IE=edge,chrome=1" />
<title>****</title>
<meta name="***" content="***" />
<meta http-equiv="***" content="text/javascript" />
<link rel="***" href="***" />
~~~~~
<link rel="stylesheet" href="***" media="all" />
<script src="***.js"></script>
~~~~~
<script src="***.js" charset="Shift_JIS"></script>
</head>
<body id="***" class="***">
<div class="***">
  <div class="***">

  <div class="***">
    <div class="***">
      <ol>
        <li><a href="/">***</a></li>
        <li><a href="***">***</a></li>
        <li><a href="***">***</a></li>
        <li><a href="***">***</a></li>
        <li>***</li>
      </ol>
    </div>
  </div>

  <div class="***">
    <div class="***">
      <h1>***</h1>
    </div>
  </div>

    ***省略***

        </div>
    </div>
</div>
</div>
<script type="text/javascript" src="***"></script>
</body>
</html>

・問題のソース
→今回作成したマクロで取得した物の中で問題のソースになります。
こっちのほうでは省略などはしてありません。これしか取得されないので困っています・・・

<?xml version="1.0" encoding="shift_jis"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "***">
<html xmlns="***/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis" />
<meta http-equiv="***" content="IE=edge,chrome=1" />
<title>***</title>
<meta http-equiv="***" content="0;URL=***/" /> 
<link rel="***" href="***" />
</head>
<body>
<script type="text/javascript" src="***"></script>
</body>
</html>

うまくいっているのものはWinMargeで比較しても綺麗に一致しているのですが
問題のものは全く違う形で取得されてしまいます。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

リクエストの UA や Accept 等でレスポンスを変えることはあります。
https://developer.mozilla.org/ja/docs/Web/HTTP/Content_negotiation

HTML5 を XHTML にする理由はわかりかねますが、コンテンツがそもそも来ないというのはログインが必要なサイトだったりしませんか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/07 17:11

    返信ありがとうございます。

    リダイレクトには気づきませんでした。
    今回問題のソースでは互換表示の設定?をしているようですが、
    この表記正しく取得されるソースにも記載されていました。

    同じマクロで同じ条件下で取得しているのでブラウザなどの違いではなさそうです。。。
    どこかにリダイレクトしているわけではなさそうに見受けられるのですが、
    当方あまりHTML、JavaScriptに詳しくないので間違っているかもしれないです。
    実はどこかにリダイレクトしているのでしょうか。。。

    キャンセル

  • 2019/10/08 11:06

    引き続き調査していたのですが、X_Xさんの言う通りリダイレクトしているのが問題ということがわかりました。
    共通して正しく取得されないページはリダイレクトされていることになかなか気づけませんでした。
    ありがとうございます。

    ただリダイレクト前のソースを取得することはできるのでしょうか・・・

    キャンセル

  • 2019/10/08 11:17

    すでにリダイレクト前のソースを取得していますよね?
    ほしい情報がなく「これしか取得されないので困っています」とのことなので、リダイレクト後のほうを取得したらいいのではないですか?

    キャンセル

+1

ソース中にJavaScriptなどの制御文が含まれていませんか?

XMLHTTPで得られるのはサーバが通知したHTTPレスポンスそのものです。
そのソース中に動的に自分自身を書き換えるような制御文(たとえばJavaScriptや
meta文によるジャンプなど)があっても動作しません。

これに対しIEやchromeで参照できるのは、(場合によりますが)それらの制御文の
処理が完了した後のソースとなります。

したがって、それらの制御文が含まれるページでは、ソースが異なる可能性が
あります。

これを調べるのに簡単なのは、
ネットワークアナライザ(Wireshark等)により、実際に流れるコンテンツを観測
することです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/07 14:33

    回答ありがとうございます。

    >ソース中にJavaScriptなどの制御文が含まれていませんか?
    含まれています。
    ただ、正しく取得できているソースにもJavaScriptは記載されています。

    >XMLHTTPで得られるのはサーバが通知したHTTPレスポンスそのものです。
    >そのソース中に動的に自分自身を書き換えるような制御文(たとえばJavaScriptや
    >meta文によるジャンプなど)があっても動作しません。
    >これに対しIEやchromeで参照できるのは、(場合によりますが)それらの制御文の
    >処理が完了した後のソースとなります。
    >したがって、それらの制御文が含まれるページでは、ソースが異なる可能性が
    あります。
    何百という画面数の中で数十件今回のような問題が起きたのですが、
    その問題が起こったソースはJavaScriptに問題があると考えたほうがよろしいということでしょうか。

    >これを調べるのに簡単なのは、
    >ネットワークアナライザ(Wireshark等)により、実際に流れるコンテンツを観測
    >することです。
    ありがとうございます。
    追加でこちらを使って調査をしてみたいと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.11%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る