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

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

新規登録して質問してみよう
ただいま回答率
85.47%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

2回答

7236閲覧

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

W.Taka

総合スコア31

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2019/10/04 01:42

編集2019/10/07 06:03

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からソースの表示で取得したものになります。
長いため色々と省略しています。

HTML

1<!DOCTYPE html> 2<html lang="ja"> 3<head prefix="*****"> 4<meta charset="Shift_JIS"/> 5<meta http-equiv="***" content="IE=edge,chrome=1" /> 6<title>****</title> 7<meta name="***" content="***" /> 8<meta http-equiv="***" content="text/javascript" /> 9<link rel="***" href="***" /> 10~~~~~ 11<link rel="stylesheet" href="***" media="all" /> 12<script src="***.js"></script> 13~~~~~ 14<script src="***.js" charset="Shift_JIS"></script> 15</head> 16<body id="***" class="***"> 17<div class="***"> 18 <div class="***"> 19 20 <div class="***"> 21 <div class="***"> 22 <ol> 23 <li><a href="/">***</a></li> 24 <li><a href="***">***</a></li> 25 <li><a href="***">***</a></li> 26 <li><a href="***">***</a></li> 27 <li>***</li> 28 </ol> 29 </div> 30 </div> 31 32 <div class="***"> 33 <div class="***"> 34 <h1>***</h1> 35 </div> 36 </div> 37 38 ***省略*** 39 40 </div> 41 </div> 42</div> 43</div> 44<script type="text/javascript" src="***"></script> 45</body> 46</html> 47

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

HTML

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

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

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

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

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

投稿2019/10/07 01:03

h.horikoshi

総合スコア505

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

W.Taka

2019/10/07 05:33

回答ありがとうございます。 >ソース中にJavaScriptなどの制御文が含まれていませんか? 含まれています。 ただ、正しく取得できているソースにもJavaScriptは記載されています。 >XMLHTTPで得られるのはサーバが通知したHTTPレスポンスそのものです。 >そのソース中に動的に自分自身を書き換えるような制御文(たとえばJavaScriptや >meta文によるジャンプなど)があっても動作しません。 >これに対しIEやchromeで参照できるのは、(場合によりますが)それらの制御文の >処理が完了した後のソースとなります。 >したがって、それらの制御文が含まれるページでは、ソースが異なる可能性が あります。 何百という画面数の中で数十件今回のような問題が起きたのですが、 その問題が起こったソースはJavaScriptに問題があると考えたほうがよろしいということでしょうか。 >これを調べるのに簡単なのは、 >ネットワークアナライザ(Wireshark等)により、実際に流れるコンテンツを観測 >することです。 ありがとうございます。 追加でこちらを使って調査をしてみたいと思います。
guest

0

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

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

投稿2019/10/04 08:38

x_x

総合スコア13749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

W.Taka

2019/10/07 05:18

回答ありがとうございます。 返信が遅れて申し訳ございません。 >リクエストの UA や Accept 等でレスポンスを変えることはあります。 同じURLでも振る舞いが変わってくるっていうことですね。 Acceptに関してはわかりませんが、UAに関しては同じコードで取得をしているので 変わりはなさそうに思えます。。。 >HTML5 を XHTML にする理由はわかりかねますが、コンテンツがそもそも来ないというのはログイン>が必要なサイトだったりしませんか? 特にログインしなければ見れないという画面ではないです。 完全にレスポンスがかえって来ないというわけではなく帰っては来るのですが 直接「ページのソースを表示」で取得した時と大きく異なる感じですね・・・ 完全な詳細は記載することができないのですがもう少しわかりやすい例を追記します。
W.Taka

2019/10/07 08:11

返信ありがとうございます。 リダイレクトには気づきませんでした。 今回問題のソースでは互換表示の設定?をしているようですが、 この表記正しく取得されるソースにも記載されていました。 同じマクロで同じ条件下で取得しているのでブラウザなどの違いではなさそうです。。。 どこかにリダイレクトしているわけではなさそうに見受けられるのですが、 当方あまりHTML、JavaScriptに詳しくないので間違っているかもしれないです。 実はどこかにリダイレクトしているのでしょうか。。。
W.Taka

2019/10/08 02:06

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

2019/10/08 02:17

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問