- PR -

Web上のデータの文字化け

投稿者投稿内容
hei
ベテラン
会議室デビュー日: 2006/09/07
投稿数: 78
投稿日時: 2006-11-07 19:33
WebBrowserでWebページに接続するものを作っているのですが、
<DIV><A href="http〜
となっている部分で、
<DIV>.InnserHTMLとした場合は正しく取得できるのに、
<A>.GetAttribute("href")とした場合は文字化けしてしまう箇所があります。

例えば、ヤフーで「ウィキペディア」で検索するとそうなります。
そのサンプルです。

’Webbrowserコントロールを追加
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.WebBrowser1.Navigate("http://search.yahoo.co.jp/search?p=%A5%A6%A5%A3%A5%AD%A5%DA%A5%C7%A5%A3%A5%A2&fr=top_v2&tid=top_v2&ei=euc-jp&search.x=1&x=0&y=0")
Application.DoEvents()
With WebBrowser1
While .IsBusy Or .ReadyState <> WebBrowserReadyState.Complete
Application.DoEvents()
End While
End With

Dim doc As HtmlDocument = WebBrowser1.Document
Dim liTagCollection As HtmlElementCollection = doc.GetElementsByTagName("OL")(0).Children
For Each liTag As HtmlElement In liTagCollection
Debug.Print(liTag.Children(0).InnerHtml)
Debug.Print(vbCrLf)
Debug.Print(liTag.Children(0).Children(0).GetAttribute("href"))
Stop
Next
End Sub
End Class

文字コードの問題かとも思ったのですが、
HttpUtility.UrlDecode(value,System.Text.Encoding.GetEncoding("UTF-8"))
などとしてみても直りません。
原因分かる方いらっしゃいますか?
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-11-07 20:05
引用:

heiさんの書き込み (2006-11-07 19:33) より:
http://search.yahoo.co.jp/search?p=%A5%A6%A5%A3%A5%AD%A5%DA%A5%C7%A5%A3%A5%A2&fr=top_v2&tid=top_v2&ei=euc-jp&search.x=1&x=0&y=0


ei=euc-jp ってなってるし、EUC-JP でデコードすれば良いんじゃないですか?
hei
ベテラン
会議室デビュー日: 2006/09/07
投稿数: 78
投稿日時: 2006-11-07 22:46
レスどうもです。

>ei=euc-jp ってなってるし、EUC-JP でデコードすれば良いんじゃないですか?
ダメでした。

例で示した、
Debug.Print(liTag.Children(0).InnerHtml)
では"%E3%82%A6%E3%82%A3%E3%82%AD%E3%83%9A%E3%83%87%E3%82%A3%E3%82%A2"という文字列が取得でき、これをHttpUtility.UrlDecodeすると(エンコードを指定しなくても)
「ウィキペディア」とデコードされます。

しかし、
同じ箇所を取得しているはずの
Debug.Print(liTag.Children(0).Children(0).GetAttribute("href"))
ではその箇所が
&#227;&#8218;&#166;&#227;&#8218;&#163;&#227;&#8218;&#173;&#227;&#402;&#353;&#227;&#402;‡&#227;&#8218;&#163;&#227;&#8218;&#162;
になってしまうのです。
(数値文字参照になっています)




[ メッセージ編集済み 編集者: hei 編集日時 2006-11-07 22:54 ]
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-11-08 11:15
うーん、何ででしょう。
最初のサンプルを僕の環境で実行したら
InnerHtml でも GetAttribute でも同じ URL が取得できました。
(UrlDecode したらウィキペディアが出てきた)

実体参照をデコードしたいなら
UrlDecode でなく HtmlDecode かなーとも思うけれど、
明らかに実体参照のコードがおかしいような。。。
冬寂
ぬし
会議室デビュー日: 2002/09/17
投稿数: 449
投稿日時: 2006-11-08 11:49
全く外していたらすみませんが、
引用:

heiさんの書き込み (2006-11-07 22:46) より:
しかし、
同じ箇所を取得しているはずの
Debug.Print(liTag.Children(0).Children(0).GetAttribute("href"))
ではその箇所が
&#227;&#8218;&#166;(長いので省略)
になってしまうのです。


IEの、ツール→インターネットオプション→詳細設定→常にUTF-8としてURLを送信する
はどうでしょうか?
hei
ベテラン
会議室デビュー日: 2006/09/07
投稿数: 78
投稿日時: 2006-11-08 13:02
環境を変えて3台のPCで試しましたが、
同じように文字化けしてしまいました。

>冬寂さん
もともとその設定になっていました。
逆にはずしてもみましたがダメでした。

%E3%82%A6%E3%82%A3%E3%82%AD%E3%83%9A%E3%83%87%E3%82%A3%E3%82%A2
以外の箇所は
liTag.Children(0).Children(0).GetAttribute("href")
でも問題なくとれるのですが・・・

[ メッセージ編集済み 編集者: hei 編集日時 2006-11-08 13:02 ]

[ メッセージ編集済み 編集者: hei 編集日時 2006-11-08 13:14 ]
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2006-11-08 14:12
URLエンコードされているhref部分を、GetAttributeが勝手に(euc-jpではないエンコーディングで)
デコードしてしまっている、ということでしょうね。そのエンコーディングを指定する箇所が
あればいいのですがね。
hei
ベテラン
会議室デビュー日: 2006/09/07
投稿数: 78
投稿日時: 2006-11-08 15:58
どうも「仕様」らしいですね。
上位要素のInnerHTMLから取得することにします。

みなさん、ありがとうございました。

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