C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: HTMLタグ文字列より属性値の取得


(過去ログ 130 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■76763 / inTopicNo.1)  HTMLタグ文字列より属性値の取得
  
□投稿者/ サイダー (1回)-(2015/08/11(Tue) 16:20:40)

分類:[VB.NET/VB2005 以降] 

開発環境:VB2008・Windows7

以下のようなHTMLタグの文字列があったとします。
その中のvalue属性の値(以下の例ではABCという文字列)を抽出したいです。

<xxx value="ABC" aaa="true">

ただし、場合によっては、対象の属性値が

<xxx value=ABC aaa=true>

のように引用符なしのケースもあるかも知れませんし、

<xxx value='ABC' aaa=true>

のような二重でない引用符が使われているかも知れません。

いずれの形式であっても、このタグのvalue値を取り出すにはどうすればいいでしょうか?
正規表現も検討してみましたが、自分の頭では手に負えなかったです(><)

以上、よろしくお願いします。
引用返信 編集キー/
■76764 / inTopicNo.2)  Re[1]: HTMLタグ文字列より属性値の取得
□投稿者/ 魔界の仮面弁士 (441回)-(2015/08/11(Tue) 16:52:08)
No76763 (サイダー さん) に返信
> いずれの形式であっても、このタグのvalue値を取り出すにはどうすればいいでしょうか?

HtmlAgilityPack.dll を使うのが簡単かと思います。
以下、Win7 + VB2008 にて動作確認。


Module Module1

 Sub Main()
  Dim s1 As String = "<xxx value=""ABC"" aaa=""true"">"
  Dim s2 As String = "<xxx value=ABC aaa=true>"
  Dim s3 As String = "<xxx value='ABC' aaa=true>"

  With New HtmlAgilityPack.HtmlDocument()
   For Each html As String In New String() {s1, s2, s3}
    .LoadHtml(html)
    Dim attr As String = .DocumentNode.SelectSingleNode("//xxx").GetAttributeValue("value", "")
    MsgBox(attr)
   Next
  End With
 End Sub

End Module
引用返信 編集キー/
■76768 / inTopicNo.3)  Re[2]: HTMLタグ文字列より属性値の取得
□投稿者/ サイダー (2回)-(2015/08/12(Wed) 10:11:24)
ありがとうございます。
HtmlAgilityPack.dll を早速調べてみます。
これはフリーのライブラリなのでしょうか?
引用返信 編集キー/
■76769 / inTopicNo.4)  Re[3]: HTMLタグ文字列より属性値の取得
□投稿者/ Azulean (507回)-(2015/08/12(Wed) 11:32:20)
No76768 (サイダー さん) に返信
> HtmlAgilityPack.dll を早速調べてみます。
> これはフリーのライブラリなのでしょうか?

検索するとわかると思いますが、Ms-PL のライセンスの元で提供されているものです。
https://htmlagilitypack.codeplex.com/
→ [License] https://htmlagilitypack.codeplex.com/license
引用返信 編集キー/
■76770 / inTopicNo.5)  Re[4]: HTMLタグ文字列より属性値の取得
□投稿者/ サイダー (3回)-(2015/08/12(Wed) 12:43:04)
ライセンスの件、ありがとうございます。
まだこのdllは試していませんが、
便利そうだったら、色々なものに使ってみようと思います。
ただ、商用では使えなさそうですね。
引用返信 編集キー/
■76785 / inTopicNo.6)  Re[1]: HTMLタグ文字列より属性値の取得
□投稿者/ ぶなっぷ (39回)-(2015/08/17(Mon) 16:05:43)
HTMLもXMLファイルの形式をとっていますので、
XMLパーサを使用してはどうでしょうか?
http://www.pine4.net/Memo/Article/Archives/71

ただし、HTMLは閉じタグを忘れてもブラウザ上では正しく表示されたりしますが、
XMLパーサはそうはいきません。

引用返信 編集キー/
■76787 / inTopicNo.7)  Re[2]: HTMLタグ文字列より属性値の取得
□投稿者/ 魔界の仮面弁士 (445回)-(2015/08/17(Mon) 20:41:44)
No76785 (ぶなっぷ さん) に返信
> HTMLもXMLファイルの形式をとっていますので、
> XMLパーサを使用してはどうでしょうか?

XHTML が相手なら XML パーサーでも代用できますが、
HTML が相手では駄目だと思いますよ。


> ただし、HTMLは閉じタグを忘れてもブラウザ上では正しく表示されたりしますが、
> XMLパーサはそうはいきません。

HTML の場合、そもそも「閉じタグが禁止」な要素さえあります。
XHTML なら <br /> と書くところですが、HTML 的には適切では無いですし。

そのほか、属性表記の差異などもありますので、
HTML を解析するなら、HTML パーサーを使うべきかと思います。
(HTMLの表記ゆれを、正規表現で吸収するのは大変ですし)


----
先の HtmlAgilityPack.dll は Ms-PL という、比較的ゆるいライセンスなのですが、
追加のライブラリを使いたくないというのであらば、こういった方法もあります。
COM ベースになるので、個人的にはあまりお奨めはしませんけれど。


Module Module1

 Sub Main()
  Dim s1 As String = "<xxx value=""ABC"" aaa=""true"">"
  Dim s2 As String = "<xxx value=ABC aaa=true>"
  Dim s3 As String = "<xxx value='ABC' aaa=true>"

  Dim doc As Object = CreateObject("htmlFile")
  doc.write(s1)
  doc.write(s2)
  doc.write(s3)
  For Each tag As Object In doc.getElementsByTagName("xxx")
   '1 = case-sensitive
   Dim attr As Object = tag.getAttribute("value", 1)
   If Not IsDBNull(attr) Then
    MsgBox(attr)
   Else
    MsgBox("なし")
   End If
  Next
 End Sub

End Module
引用返信 編集キー/
■76790 / inTopicNo.8)  Re[3]: HTMLタグ文字列より属性値の取得
□投稿者/ ぶなっぷ (40回)-(2015/08/18(Tue) 10:29:55)
なるほど、
> HTML の場合、そもそも「閉じタグが禁止」な要素さえあります。
となると、XMLパーサーは適切でないですね。

失礼しました。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -