HTML取得について


自衛君  2003-12-18 00:17:02  No: 80953

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-18 00:23:09  No: 80954

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


魔界の仮面弁士  2003-12-18 01:05:17  No: 80955

> この省略されているのはなぜでしょうか?
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-19 01:23:47  No: 80956

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

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

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


自衛君  2003-12-19 01:27:04  No: 80957

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


魔界の仮面弁士  2003-12-19 03:10:08  No: 80958

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

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

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


自衛君  2003-12-22 21:29:40  No: 80959

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

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


魔界の仮面弁士  2003-12-22 22:12:13  No: 80960

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

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

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

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


自衛君  2003-12-24 23:12:47  No: 80961

ご返信ありがとうございます。
>「"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-25 00:18:24  No: 80962

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加