ken3memo (三流君)

挨拶・自己紹介:
失敗続きのAB型の変わり者 :三流プログラマー Ken3です
フリーのエンジニア・個人事業主です・・と書くと聞こえはイイが(それとなくカッコよく聞こえるが)、 現在は小さな案件の受注請負 と 短期派遣 で 日々つつましく?ほそぼそと暮らしてます。
(※詳細は[三流君 三流プログラマーとは?]を見てください)




[記事一覧、バックナンバーを見る]

2009-09-04

MSHTMLを参照設定後、As HTMLDocument と.createDocumentFromUrlで文章を読み込み使うテスト

2012/01/12 追記

人力検索の回答に似たような処理があったので、先に

http://q.hatena.ne.jp/1326289490#a1127039

↑こちらを参考にするといいかも。


元の三流君記事

まず、他店(他のサイト)の紹介から

http://q.hatena.ne.jp/1250623193#a942081 の 回答1:HALSPECIAL さんの紹介サイト

Web ページをダウンロードする方法? MSXML 編? ※1

http://www.f3.dion.ne.jp/~element/msaccess/AcTipsVbaXMLHTTP.html

を見て、

紙の辞書で目的の単語のそばで、違う単語を見て勉強になったなぁ、、じゃないけど、

隣の?

Web ページをダウンロードする方法〜 MSHTML 編〜 ※2

http://www.f3.dion.ne.jp/~element/msaccess/AcTipsMSHTML.html

MSHTML 編が面白かったので、使ってみました。

紹介者のHALSPECIAL さん と サンプルページ※1※2 作成者のYU-TANG さんに感謝しつつ、

私は、ネット上のHTML文章処理、いつもIEを表示して使っていますが、

MSHTMLを参照設定して、

As HTMLDocument

こいつで使う方法があるみたいです。

まず、MSHTMLを参照設定して、から、

Set objMOTO = New HTMLDocument

で1つ親を作り、

.createDocumentFromUrl(strURL, vbNullString)

で、新規文章を読み込むと、あとは、普通に文章にアクセスできそうです。

※いつもは、CreateでIE作って、.Navigate でページを表示だったけど、、、

※※参照設定しない方法を http://d.hatena.ne.jp/ken3memo/20090903/1251991651 で探ったが失敗・・・

説明は、置いて置き、参照設定して、ソースを貼り付けて実際に動かしてみてください。

f:id:ken3memo:20090904095802j:image

Option Explicit

Sub aaa()  'okwave 回答の取り込み処理  テストで1つだけ。

    Const strURL = "http://okwave.jp/qa5201496.html"  'テスト用のURL

    'まず、元を参照設定してあるので、Newで作る
    'Web ページをダウンロードする方法〜 MSHTML 編〜
    'http://www.f3.dion.ne.jp/~element/msaccess/AcTipsMSHTML.html
    'を参照 と その中で紹介されている http://www.pcreview.co.uk/forums/thread-1424062.php#post12485559
    Dim objMOTO  As HTMLDocument   '親元のオブジェクトが必要なので
    Set objMOTO = New HTMLDocument '変数宣言↑と一緒にやれよ、、と言われそうだけど。。。
    objMOTO.designMode = "on"  '←これで、警告が出ない、かわりに、JavaScriptなどが走らないので動的ページは不可?

    'やっと、捕まえたい文章を変数に入れる。
    Dim objDOC   As HTMLDocument  'こっちを、使用する。(文章を読み込変数)
    
    '.createDocumentFromUrl なんて感じで、簡単に読めるみたい。
    Set objDOC = objMOTO.createDocumentFromUrl(strURL, vbNullString)

    'あとは、読み込み待ち、文章が .readyState = "complete" になるまでループ
    While objDOC.readyState <> "complete"  '※文字の比較です、いつもの4じゃないよ注意してね。
        DoEvents  '嫌いな人、居るけど、いつものヤツ(笑)
    Wend
    
    '読み込めたら、HTML文章としてGetできたら、あとはいつものタグ処理で、、、
    'TRのタグを抜く
    Dim objTR As HTMLTableRow  '行のオブジェクト
    Dim strTEXT As String      '変数名が変だけど
    Dim xCNT  As Integer 'セル列のカウンター
    Dim yCNT  As Integer 'セル行のカウンター
    
    yCNT = 10 'テストで10行目にセットする
    xCNT = 5  '回答をE列5からセットする
    
    '文章(objDOC)全体(.all)からタグのTR(.tags("TR"))を1つ1つ処理
    For Each objTR In objDOC.all.tags("TR")
        strTEXT = objTR.innerText  '行のテキストを取り出す。
        Debug.Print strTEXT
        
        '左から4文字で判断、たまたま、4文字だったので
        Select Case Left(strTEXT, 4)
            Case "質問者:"  '質問者の行にタイトルが入ってます
                Cells(yCNT, "C") = strTEXT  '行の文字列をセット
            
            Case "困り度:"  'ここに、質問内容
                Cells(yCNT, "D") = strTEXT  '質問内容をDへ
                
            Case "回答者:"  'ここが回答、複数回答があるので、カウンターをずらす。
                Cells(yCNT, xCNT) = strTEXT  '質問内容をE〜
                xCNT = xCNT + 1
                
        End Select
        '↑素朴な疑問、この回答へのお礼は必要ないのかなぁ??
        
    Next

    Set objTR = Nothing
    Set objDOC = Nothing
    Set objMOTO = Nothing

    MsgBox "終了"

End Sub

処理のポイントは

Set objDOC = objMOTO.createDocumentFromUrl(strURL, vbNullString)

で、objDOCにURL(okwave)の文章が読まれるので、

手抜きで、まず、テーブル・表から行単位の抜き出し

For Each objTR In objDOC.all.tags("TR")

で、1行のデータがobjTRに入るので、

ここから、テキストデータを.innerText で抜きます。

strTEXT = objTR.innerText '行のテキストを取り出す。

で、左から4文字を比べ、単純にセットしました。

たぶん、URLの一覧は、

http://q.hatena.ne.jp/1251504373

で、B列に取れていると思うので、

Sub xxxx(strURL, yCNT) '

↑みたいにURLとセット行位置を受け取って回すようにすれば、

いいのでは、、、と、蛇足ですが、思ったり。

IEを使わないで、MSHTMLで文章を処理する参考となれば、、、

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証





[記事一覧、バックナンバーを見る]








ブログトップ 記事一覧 ログイン 無料ブログ開設