HTMLを以下のコードで取得しているのですが、
IEで"ソースの表示"を行った場合と比較するといくつか省略
されています。
この省略されているのはなぜでしょうか?またIEで表示した
ソースをそのまま取ることはできるのでしょうか?
教えてください。m(_ _)m
Dim n As Integer
Dim html As String
For n = 0 To IE.Document.All.length - 1
If UCase(Trim(IE.Document.All(n).tagName)) = "HTML" Then
'HTMLのテキスト
html = IE.Document.All(n).outerHTML
End If
Next
省略されている例を載せ忘れました;;
たとえば
IEソースの表示 <INPUT TYPE="text" name="id" >
上のコードの場合 <INPUT name="id">
とTYPE="text"が省略されてしまいます。
> この省略されているのはなぜでしょうか?
documentオブジェクトで取得される内容は、HTMLの内容を解析した物です。
IE.Document.documentElement.outerHTML などとしても、得られる値は、
解析後の結果をHTMLテキストに「再構築」した物なのです。そのため、
オリジナルのソースとは若干異なった物になります。
例えば今回の事例以外にも、大文字小文字の変化、文字コードの変化などが
発生しますし、そのページにHTMLの内容を書き換えるようなJScriptの
記述(Dynamic HTML)があれば、それに合わせて、outerHTMLの結果も
変化してしまいます。
> ソースをそのまま取ることはできるのでしょうか?
IE.Documentから、オリジナルのHTMLをそのまま取得したい場合は、
IPersistFileインターフェイスでファイル化するか、もしくは、
IPersistStreamInitインターフェイスを使えばOKです。
Dim PF As IPersistFile
Set PF = IE.Document
PF.Save "C:\sample.html", False
Set PF = Nothing
ただしこの方法の場合、レイトバインディングでは実装できません。
各インターフェイス用の参照設定が必要です。
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200312/03120090.txt
http://www.bcap.co.jp/hanafusa/vbbbs/wforum.cgi?mode=allread&no=3822
魔界の仮面弁士様、返信ありがとうございます。
おかげでHTML文書が省略されている理由がやっとわかりました。
それで、返信文を参考に
クラスモジュールにPersistFileを追加して
以下のソースでファイル保存することができました。
With New PersistFile
.SetObject IE.Document
'.Save "D:\VB\sample.html", False
End With
私の使用上、HTML文書を変数に格納したいのですがファイル化
したら保存したファイルをもう一回変数に読み出すしかないの
でしょうか?上の処理をファイルに保存ではなく変数に
格納することもできるのでしょうか?
すみません。言い忘れましたが、魔界の仮面弁士様が
作成したPersistFileを使わせていただいております。
申し訳ありません。m(_ _)m
> 上の処理をファイルに保存ではなく変数に
> 格納することもできるのでしょうか?
IPersistFileインターフェイスでではなく、
IPersistStreamInitインターフェイスを使えばOKです。
サンプルは書きませんが、Saveメソッドの実行時に、
「ファイル名を示す文字列」を渡すのではなく、
「ストリーム」を渡すという点だけの違いです。
# 出力先としては、ADODB.Streamオブジェクトあたりが手軽かも。
魔界の仮面弁士さまご返信ありがとうございます。
ストリーム?_?を渡す ということは
With New PersistStreamInit
.SetObject IE.Document
'.Save "D:sample.html", False
.Save "ADODB.stream", False
End With
ってことですよね?
上のソースでは何もエラーが出ないのですが、
これ以降で、ADODB.streamオブジェクトをオブジェクト
として扱おうとしても定義されていないと言われてしまいます。
なにか宣言などが必要なのでしょうか?
「"D:\sample.html"」ではなく、「"D:sample.html"」と指定しているのでしょうか?
> .Save "ADODB.stream", False
『"ADODB.stream"という文字列』を渡すのではなく、
Streamオブジェクトのインスタンスを渡してください。
ADOを参照設定してNewしても良いですし、
CreateObject関数で生成してもOKです。
> 上のソースでは何もエラーが出ないのですが、
そのソースだと、「エラーにならない」という事の方が問題かも知れません。
データ型が異なる(Streamを渡すところにStringを渡してある)ので、
そのコードの場合は、エラーが出る方が正解だと思います。
ご返信ありがとうございます。
>「"D:\sample.html"」ではなく、「"D:sample.html"」と指定しているので
>しょうか?
記述ミスでしたすみません;
>> 上のソースでは何もエラーが出ないのですが、
エラーでました、PersistStreamInitとPersistFileを
間違えてました。
いまいち変数に格納する流れがよくわからないのですが、
下のソースの****の位置に
(1)インスタンスを生成
(2)生成したインスタンスを渡す
(3)変数に格納という感じでいいのですか?
どこかにサンプルソースなどはありませんか?
Dim AD As Object
Set AD = CreateObject("ADODB.Stream")
****(1)インスタンス生成********
With New PersistFile
.SetObject IE.Document
.Save ****(2)*******, False
End With
****(3)********
> Dim AD As Object
> Set AD = CreateObject("ADODB.Stream")
レイトバインドでもいけますが、最初のうちは、
Microsoft ActiveX Data Object (2.5以上) を参照設定した上で、
Dim Stm As ADODB.Stream
Set Stm = New ADODB.Stream
などとした方が、VBのIntelliSense(入力補完機能)が使えるので、楽ですよ。
> どこかにサンプルソースなどはありませんか?
こんな感じですかね。
Set Stm = New ADODB.Stream
Stm.Type = adTypeBinary
Stm.Open
If TypeOf IE.Document Is IPersistStreamInit Then
Set X = IE.Document
X.Save Stm, False
Set X = Nothing
End If
なお、変数 IE は InternetExplorerオブジェクトを指しています。
変数 Stm は ADODB.Streamオブジェクト、X は IPersistStreamInit です。
あとは、Stm の内容を SaveToFile するなり、Read するなり、CopyToするなり御自由に。
ツイート | ![]() |