- PR -

HtmlElement.GetAttributeで属性の値が取得出来ない

1
投稿者投稿内容
まるみ
会議室デビュー日: 2007/02/25
投稿数: 3
お住まい・勤務地: 東京
投稿日時: 2007-07-30 23:45
初めまして。いつも大変参考にさせて頂いております。
早速ですが、掲題の件で質問させて下さい。
VS2005のVBで開発を行っております。

■事象

(1)下記のTABLEタグを含むHTMLページをwebbrowserクラスで表示し

<TABLE border="0" cellspacing="0" cellpadding="0" width="100%" class="footer">
(中略)
</table>

(2)下記のコードでTblElm.GetAttribute("class")を取得したいのですが、取得できません。

    (前略)
For Each TblElm In WB.Document.GetElementsByTagName("table")

Debug.WriteLine("*** TblElm.count : " & Cnt)
Debug.WriteLine("width : " & TblElm.GetAttribute("width"))
Debug.WriteLine("class : " & TblElm.GetAttribute("class"))
Debug.WriteLine(TblElm.OuterHtml)

If TblElm.TagName = "TABLE" Then
If TableNum = Cnt AndAlso _
TblElm.GetAttribute("class") <> "footer" Then
Return TblElm
End If
Cnt += 1
End If
Next
    (後略)

(3)デバッグコードの出力内容は下記の通りです。
widthの値は取得できているのですが、classの値が取得できません。
良く見ると、<table>タグの各属性の順序およびリテラルの有無が、
上記(1)のオリジナルHTMLと異なっています。
値にリテラルの付いている「width」だけがうまく取得できたようです。

*** TblElm.count : 8
width : 100%
class :
<TABLE class=footer cellSpacing=0 cellPadding=0 width="100%" border=0><TBODY>
(・・・中略・・・)
</TD></TR></TBODY></TABLE></DIV></TD></TR></TBODY></TABLE>

■解決に向けての質問

(1)オリジナルHTMLとTblElm.OuterHtmlの内容が異なってしまう原因は何でしょうか。VBの仕様なのでしょうか。
それともコードを書く上で何か注意点があるのでしょうか。

(2)実現したいのは「複数の<table>要素の中からこのテーブルを特定する」ということなのですが、HTML側は改修出来ません。
ですので、現在保有している属性だけを手がかりとしたく、特定可能なのは属性はclassのみという状態です。
上記(1)の疑問点が解消出来ない場合でも、この属性を取得する方法はありますでしょうか。

***

初めての書き込みで必要な情報をうまくお伝え出来たかどうか不安ですが、有識者の方にご教示&アドバイス頂ければ幸いです。

どうぞ宜しくお願い致します。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2007-07-31 01:05
.GetAttribute("className")で取得できるようです。
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2007-07-31 02:08
引用:

(1)オリジナルHTMLとTblElm.OuterHtmlの内容が異なってしまう原因は何でしょうか。VBの仕様なのでしょうか。
それともコードを書く上で何か注意点があるのでしょうか。



HTML において、一つの要素内の属性の出現順は意味がありません。また大文字小文字の区別もありません。引用符の有無も任意です。
ですから、意味的には OuterHtml の出力と元の HTML に差はありません。
WebBrowser は、自分が扱いやすいように HTML を解析して DOM というツリーを作成します。OuterHtml はそのツリーを改めて HTML に書き直したものなので、元の HTML とは意味的には同じでも表現が違う場合があります。


WebBrowser を扱うなら、IHTML で始まる各種 COM インターフェイスを調べておくといいでしょう。
System.Windows.Forms.WebBrowser から直接それらを利用することはできませんが、一部のプロパティやメソッドは GetAttribute や InvokeMember を使って呼び出すことが可能です。
今回の class 属性にしても、IHTMLElement を調べれば className プロパティが見つかります。ここから、GetAttribute("className") が推測できるというわけです。
// たぶん、MSDN にはそれらの和訳はありませんけど……。
まるみ
会議室デビュー日: 2007/02/25
投稿数: 3
お住まい・勤務地: 東京
投稿日時: 2007-07-31 02:34
>べる様

早速のご回答有難うございました。
ご教示頂いた方法でうまく動作致しました。
助かりました。

>Hongliang様

大変分かり易く詳しい解説を有難うございます。恐縮です。
先にご回答頂いたべる様に「className」について
どのようにお調べになられたのかを重ねて質問させて
頂こうとしていた矢先でした。
頂いた大きなヒント
「IHTML で始まる各種 COM インターフェイス」については、
今後の調査の際の参照情報範囲にしっかり入れておくように
致します。

***

ベテランの皆様に、しかもこんなに早くご回答を頂く事が
出来まして感激しております。

またどうしても解決出来ない問題に直面してしまった際には
質問させて頂くこともあるかと思いますが、今後とも
どうぞ宜しくお願い致します。

本当に有難うございました☆
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2007-07-31 02:47
引用:
VBの仕様なのでしょうか。

IEのDOMの仕様でしょうね。どうもjavascriptでもclassNameで取れるぽいです。

引用:
先にご回答頂いたべる様に「className」について
どのようにお調べになられたのかを重ねて質問させて
頂こうとしていた矢先でした。

私は「GetAttribute class」でぐぐりました。
まるみ
会議室デビュー日: 2007/02/25
投稿数: 3
お住まい・勤務地: 東京
投稿日時: 2007-07-31 02:54
>べる様

うわわわ〜、ほんとですね!
classというキーワード自体が特殊なものだったとは
思いもよらなかったもので、
「VB」「HTMLElement」「.GetAttribute」「取得出来ない」「TABLE」「リテラル」
といったキーワードばかり組み合わせて検索してみていました・・・(汗)

思い込みは視野が狭くなっていけませんね・・・。
どうも有り難うございました!
1

スキルアップ/キャリアアップ(JOB@IT)