HTML取得について


自衛君  2003-12-17 15:17:02  No: 80953  IP: [192.*.*.*]

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

編集 削除
自衛君  2003-12-17 15:23:09  No: 80954  IP: [192.*.*.*]

省略されている例を載せ忘れました;;
たとえば
IEソースの表示    <INPUT TYPE="text" name="id" >
上のコードの場合  <INPUT name="id">
とTYPE="text"が省略されてしまいます。

編集 削除
魔界の仮面弁士  2003-12-17 16:05:17  No: 80955  IP: [192.*.*.*]

> この省略されているのはなぜでしょうか?
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

編集 削除
自衛君  2003-12-18 16:23:47  No: 80956  IP: [192.*.*.*]

魔界の仮面弁士様、返信ありがとうございます。
おかげでHTML文書が省略されている理由がやっとわかりました。

それで、返信文を参考に
クラスモジュールにPersistFileを追加して
以下のソースでファイル保存することができました。
 With New PersistFile
        .SetObject IE.Document
        '.Save "D:\VB\sample.html", False
 End With

私の使用上、HTML文書を変数に格納したいのですがファイル化
したら保存したファイルをもう一回変数に読み出すしかないの
でしょうか?上の処理をファイルに保存ではなく変数に
格納することもできるのでしょうか?

編集 削除
自衛君  2003-12-18 16:27:04  No: 80957  IP: [192.*.*.*]

すみません。言い忘れましたが、魔界の仮面弁士様が
作成したPersistFileを使わせていただいております。
申し訳ありません。m(_ _)m

編集 削除
魔界の仮面弁士  2003-12-18 18:10:08  No: 80958  IP: [192.*.*.*]

> 上の処理をファイルに保存ではなく変数に
> 格納することもできるのでしょうか?
IPersistFileインターフェイスでではなく、
IPersistStreamInitインターフェイスを使えばOKです。

サンプルは書きませんが、Saveメソッドの実行時に、
「ファイル名を示す文字列」を渡すのではなく、
「ストリーム」を渡すという点だけの違いです。

# 出力先としては、ADODB.Streamオブジェクトあたりが手軽かも。

編集 削除
自衛君  2003-12-22 12:29:40  No: 80959  IP: [192.*.*.*]

魔界の仮面弁士さまご返信ありがとうございます。
ストリーム?_?を渡す  ということは  
  With New PersistStreamInit
        .SetObject IE.Document
        '.Save "D:sample.html", False
        .Save "ADODB.stream", False
  End With

ってことですよね?
上のソースでは何もエラーが出ないのですが、
これ以降で、ADODB.streamオブジェクトをオブジェクト
として扱おうとしても定義されていないと言われてしまいます。
なにか宣言などが必要なのでしょうか?

編集 削除
魔界の仮面弁士  2003-12-22 13:12:13  No: 80960  IP: [192.*.*.*]

「"D:\sample.html"」ではなく、「"D:sample.html"」と指定しているのでしょうか?

> .Save "ADODB.stream", False
『"ADODB.stream"という文字列』を渡すのではなく、
Streamオブジェクトのインスタンスを渡してください。

ADOを参照設定してNewしても良いですし、
CreateObject関数で生成してもOKです。


> 上のソースでは何もエラーが出ないのですが、
そのソースだと、「エラーにならない」という事の方が問題かも知れません。
データ型が異なる(Streamを渡すところにStringを渡してある)ので、
そのコードの場合は、エラーが出る方が正解だと思います。

編集 削除
自衛君  2003-12-24 14:12:47  No: 80961  IP: [192.*.*.*]

ご返信ありがとうございます。
>「"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)********

編集 削除
魔界の仮面弁士  2003-12-24 15:18:24  No: 80962  IP: [192.*.*.*]

>  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するなり御自由に。

編集 削除