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

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

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

Re[9]: HTMLファイルのチェックを行いたいのですが


(過去ログ 19 を表示中)

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

■7520 / inTopicNo.1)  HTMLファイルのチェックを行いたいのですが
  
□投稿者/ nbmyou (26回)-(2007/09/07(Fri) 13:59:51)

分類:[C#] 

当掲示板には、いつもお世話になっております。
初心者のnbmyouと申します。

(※ほとんどHTMLに関する質問であるため、掲示板違いであれば申し訳ありません)

現在、外部から渡されたHTMLファイルを
チェックするプログラムをC#で書こうと思っています。
(表示ブラウザはIE6のみを想定しています)

HTMLファイルのパスを引数として受け取り、
ファイルの中身を一つの文字列とし、その中身をチェックします。

チェック項目はとりあえず以下を想定しています。
●「ページ全体の横幅が何pixelか」
●「リンクがある場合、リンク先が、同サーバ上か外部(インターネット上)か」


私がわからずにいるのは、以下の点です。
 ・「ページ全体の横幅」を調べようにも、様々なタグにwidth属性があるため、
  漏れなく全体を調べ、『ページ全体の横幅』を算出することはできるのかどうか。
 ・リンクがあるかどうかは、<a>か<link>のhref属性を調べるだけで、漏れはないかどうか。
 ・リンク先が外部かどうか調べるには、"http://"という文字列があるかどうかの調査で足りるかどうか。
+++++++++++

お手数ですが、回答いただけると助かります。
よろしくお願いいたします。
引用返信 編集キー/
■7521 / inTopicNo.2)  Re[1]: HTMLファイルのチェックを行いたいのですが
□投稿者/ 774RR (32回)-(2007/09/07(Fri) 14:05:25)
> (表示ブラウザはIE6のみを想定しています)
そんなことすべきぢゃ無い。

HTML をどう表示するかは User Agent 次第なので
> ●「ページ全体の横幅が何pixelか」
こんなものは原理的に判断するすべは無いし、判断しちゃいけない。
目の不自由な人向け読み上げエージェントなら、そもそも横幅自体存在しないだろう
IE6 に限定してもカスタムスタイルシートを指定したり、
そこまでやらずとも文字サイズ大中小で変わるし、判断できるはずが無い。

>・リンク先が外部かどうか調べるには、"http://"という文字列があるかどうかの調査で足りるかどうか。
「リンク先」とは何か?「外部」とは何か?が判断基準が無いのでパス。

引用返信 編集キー/
■7523 / inTopicNo.3)  Re[2]: HTMLファイルのチェックを行いたいのですが
□投稿者/ Ri (10回)-(2007/09/07(Fri) 14:11:14)
↑↑↑
全然答えになってない
引用返信 編集キー/
■7527 / inTopicNo.4)  Re[2]: HTMLファイルのチェックを行いたいのですが
□投稿者/ nbmyou (27回)-(2007/09/07(Fri) 14:18:40)
2007/09/07(Fri) 14:22:18 編集(投稿者)
2007/09/07(Fri) 14:22:16 編集(投稿者)

No7521 (774RR さん) に返信

早速の回答、ありがとうございます。
>>(表示ブラウザはIE6のみを想定しています)
> そんなことすべきぢゃ無い。
社内用のサイトなので、社員は必ずIE6を使用するようにということに決まっている環境です。
ですのでIE6で見たときに、例えば横幅800pixel以内であればOK、などというチェックを行いたく思っています。

> IE6 に限定してもカスタムスタイルシートを指定したり、
> そこまでやらずとも文字サイズ大中小で変わるし、判断できるはずが無い。
絶対に判断できないものでしょうか。

> >・リンク先が外部かどうか調べるには、"http://"という文字列があるかどうかの調査で足りるかどうか。
> 「リンク先」とは何か?「外部」とは何か?が判断基準が無いのでパス。
「リンクがある場合、リンク先が、同サーバ上か外部(インターネット上)か」
を調べるにあたり、
私が考えているリンクとは、ページ上のある部分をマウスクリックした際に、
「同ページのとある点」や、「他ページ」にジャンプする機能と考えております。
よって「リンク先」とは、そのジャンプする先のことです。
また、「外部」についてですが、インターネット上の別サイトへ
(例えば、この「C# と VB.NET の質問掲示板」から、「YouTube」へ)という意味で考えております。

判断基準として、情報が足りない場合は
お手数ですが、また指摘をお願いいたします。
引用返信 編集キー/
■7539 / inTopicNo.5)  Re[3]: HTMLファイルのチェックを行いたいのですが
□投稿者/ 774RR (33回)-(2007/09/07(Fri) 15:52:09)
HTML ファイルだけ与えても CSS がないので UA がどうレンダーするかは知りようが無い
そもそも HTML って「論理的データ構造」を表現するものなので、
HTML だけをもって「見栄え」を論じるのはちゃんちゃらおかしい
原理的に無理なことはやらないべきだろうな
どうしてもやりたければHTML+CSSをすべて用意し実際に IE6 で開いてみるのがいいし、
たぶんそれしか手は無い。

「リンク」はまあ <a> のことだと俺も思う。んで「外部」だけど、例えば
http://www.sample.com/index.html の中にリンクが張ってあるとして
<a href="#footnote1">注釈1</a> は内部リンク、と俺も思うが
<a href="page1.html">ページ1</a> は外部なのか?
<a href="http://www.sample.com/page2.html">ページ2</a> は外部なのか?
<a href="ftp://ftp.sample.com/pub/sample.zip">サンプルをダウンロード</a> は外部なのか?
<a href="mailto:author@sample.com">作者にメール</a> は外部なのか?

<a link="..."> なんて聞いたこと無いが...

ここってタグを認識しちゃうの?うまく書けないので<a としたけど本当はASCII不等号ね

引用返信 編集キー/
■7542 / inTopicNo.6)  Re[4]: HTMLファイルのチェックを行いたいのですが
□投稿者/ nbmyou (28回)-(2007/09/07(Fri) 16:36:43)
2007/09/07(Fri) 16:38:21 編集(投稿者)
2007/09/07(Fri) 16:37:07 編集(投稿者)

No7539 (774RR さん) に返信

再度の素早い回答、ありがとうございます。

> どうしてもやりたければHTML+CSSをすべて用意し実際に IE6 で開いてみるのがいいし、
> たぶんそれしか手は無い。
なるほど。そういうものなのですね。
それであれば、C#から、開いたページの情報(横幅など)を取得する方法はありますでしょうか。
(画面上見えない状態でできれば、ベストなのですが)

1度IEに喰わせてそこから情報を取得する、「WebなんとかControl」(曖昧ですみません)
というクラスがあるような話を聞いたことがある気がするのですが、
今検索してみても見つけることができていません。
これも含め、お分かりになる方がいらっしゃいましたら、よろしくお願いいたします。


> <a href="page1.html">ページ1</a> は外部なのか?
href="page1.html"でも、外部である可能性はあるのでしょうか。
この場合、内部だと思い込んでおりました。
教えていただけると助かります。


> <a href="http://www.sample.com/page2.html">ページ2</a> は外部なのか?
この記述の仕方だと、今は内部でも、ドメインが変わることによって外部になる可能性があるので、
「外部とみなす」ことにしようと思います。


> <a href="ftp://ftp.sample.com/pub/sample.zip">サンプルをダウンロード</a> は外部なのか?
この場合は「外部」にしようと思います。
が、想定しておりませんでした。勉強になります。


> <a href="mailto:author@sample.com">作者にメール</a> は外部なのか?
これも想定していませんでした。
メールを送れるようにすることを許容するかどうか、仕様を確認しよう(もしくは考えよう)と思います。


> <a link="..."> なんて聞いたこと無いが...
<link href="...">のことでした。
言葉足らずで申し訳ありません。
引用返信 編集キー/
■7545 / inTopicNo.7)  Re[5]: HTMLファイルのチェックを行いたいのですが
□投稿者/ mあ (57回)-(2007/09/07(Fri) 17:13:03)
2007/09/07(Fri) 17:37:21 編集(投稿者)
2007/09/07(Fri) 17:30:26 編集(投稿者)
2007/09/07(Fri) 17:14:16 編集(投稿者)
<pre><pre>■No7542 (nbmyou さん) に返信
> 2007/09/07(Fri) 16:38:21 編集(投稿者)
> 2007/09/07(Fri) 16:37:07 編集(投稿者)
> 
> ■No7539 (774RR さん) に返信
> 
> 
>><a href="page1.html">ページ1</a> は外部なのか?
> href="page1.html"でも、外部である可能性はあるのでしょうか。
> この場合、内部だと思い込んでおりました。
> 教えていただけると助かります。

<base href="http://www.google.co.jp/" />  とか。


> 
>><a link="..."> なんて聞いたこと無いが...
> <link href="...">のことでした。
> 言葉足らずで申し訳ありません。

いや、間違ってはいない。
<a link=""> でもOKですよ。HTMLパーサーなら無視されるだけだし、Xmlパーサーなら link 内容
が取得できます。

<a id="AAA" href="javascript:void(0)" link="http://www.google.co.jp" target="_blank">あああ&lt;/a&gt;
<script>
window.onload = function() {
	try {
		alert(document.getElementById("AAA").getAttribute("link"))
	}
	catch(e) {
		alert(e);
	}
}
</script>

無視されませんね・・・・

以下のサンプルは、google だけど、右寄せアイテムがあるだけで幅の判定が極めて難しいですよねw
align=right が スタイル・HTML属性で指定されている場合は、表示幅は当てにならない。
全コンテンツがセンタリングの場合は更に難しい(左右の判定とマージンを加味して・・・)
スクロールバーの移動量でも計ります??


Imports System
Imports System.Windows.Forms
Imports System.Security.Permissions

'' 詳細は ObjectForScripting サンプルを参照
<PermissionSet(SecurityAction.Demand, Name:="FullTrust")> _
<System.Runtime.InteropServices.ComVisibleAttribute(True)> _
Public Class Form1

    Private WithEvents web As New WebBrowser

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        web.Dock = DockStyle.Fill
        Me.Controls.Add(web)

        '' 横 800 に収まる画面レイアウトかどうかを判定 
        Me.Size = New Size(1200, 600)

        web.ObjectForScripting = Me

        AddHandler web.DocumentCompleted, AddressOf cc
        web.Navigate(New Uri("http://www.google.co.jp/"))


    End Sub

    Private Sub cc(ByVal sender As Object, ByVal e As WebBrowserDocumentCompletedEventArgs)

        Try


            Dim atags As HtmlElementCollection = web.Document.Body.GetElementsByTagName("A")
            Dim ens As IEnumerator = atags.GetEnumerator

            Do While ens.MoveNext
                Dim h As HtmlElement = DirectCast(ens.Current, HtmlElement)
                Console.WriteLine(h.GetAttribute("href"))
            Loop


            Dim str As String
            str = "javascript:a=document.body.firstChild;w=0;while(a){if(a.offsetWidth>w){w=a.offsetWidth;}a=a.nextSibling;};window.external.Test(w);"

            web.Url = (New Uri(str))

        Catch ex As Exception
            Console.WriteLine(ex.Message + "::" + ex.StackTrace)
        End Try

    End Sub


    Public Sub Test(ByVal width As Integer)

        Console.WriteLine("最大幅は => {0}", width)

    End Sub
End Class



C#でしたね、まぁ、そんなに変わる部分も無いと思っていますが・・・無理ですか??
</pre></pre>

引用返信 編集キー/
■7552 / inTopicNo.8)  Re[6]: HTMLファイルのチェックを行いたいのですが
□投稿者/ YAS (24回)-(2007/09/07(Fri) 19:09:34)
2007/09/07(Fri) 19:13:39 編集(投稿者)
WebBrowserに一度読み込んで幅を取得するのがよいと思います。
しかし,フレームを使っている場合など,幅が取得できないWebページもあります。
また,取得までかなり時間がかかります。

Public Class Form1

    Dim WithEvents Browser As New WebBrowser

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Controls.Add(Me.Browser)
        Me.Browser.Dock = DockStyle.Fill
        Me.Browser.Navigate("http://www.yahoo.co.jp")
    End Sub

    Private Sub Browser_DocumentCompleted(ByVal sender As Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles Browser.DocumentCompleted
        MessageBox.Show("幅=" & DirectCast(sender, WebBrowser).Document.Body.ScrollRectangle.Width)
        Me.Browser.ScrollBarsEnabled = False
        Me.ClientSize = New Size(Me.Browser.Document.Body.ScrollRectangle.Width, Me.ClientSize.Height)
    End Sub

End Class

WebBrowserコントロールを表示したくない場合

Public Class Form1

    Dim WithEvents Browser As New WebBrowser

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Browser.Navigate("http://www.yahoo.co.jp")
    End Sub

    Private Sub Browser_DocumentCompleted(ByVal sender As Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles Browser.DocumentCompleted
        MessageBox.Show("幅=" & DirectCast(sender, WebBrowser).Document.Body.ScrollRectangle.Width)
    End Sub

End Class

追記:ごめんなさい。C#でしたね。

引用返信 編集キー/
■7553 / inTopicNo.9)  Re[7]: HTMLファイルのチェックを行いたいのですが
□投稿者/ nbmyou (29回)-(2007/09/07(Fri) 19:12:55)
mあ さん
YAS さん

サンプルつきでの回答、どうもありがとうございます。
VBはやったことがないため難しいですが、読めなくもないと思うので、
サンプルを参考にしながら頑張ってみます。

また、他にも回答いただける方がいらっしゃいましたら、
よろしくお願いいたします。
引用返信 編集キー/
■7556 / inTopicNo.10)  Re[8]: HTMLファイルのチェックを行いたいのですが
□投稿者/ Jitta on the way (4回)-(2007/09/07(Fri) 20:54:44)
誰が、どういう目的で使い、
結果をどこに、どの様に出力するのでしょう?

サイトを作った人が申告して、そのまま直せるようなものがいいのか。管理者が全部チェックするのか。
それによって変わらない?
引用返信 編集キー/
■7616 / inTopicNo.11)  Re[9]: HTMLファイルのチェックを行いたいのですが
□投稿者/ PATIO (13回)-(2007/09/11(Tue) 16:12:12)
Jittaさんも書かれていますけれど、
やりたい処理の使用目的とか、作る必要になった背景とか、実際の利用シーンとか
こういった情報も一緒に提示するとやりたい事の本当の部分が見えてきやすくなるので
適切なレスポンスをもらえる可能性が高くなると思います。
もしかしたら他の切り口があるかもしれませんから。

引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -