DOBON.NETプログラミング道掲示板

ツリー一括表示

Nomalアイコン WebBrowser Controlを使って、任意の値を取得 /げんむ (20/03/18(Wed) 21:43) #34430
Nomalアイコン Re[1]: WebBrowser Controlを使って、任意の値を取得 /Hongliang (20/03/18(Wed) 22:16) #34431
│└Nomalアイコン Re[2]: WebBrowser Controlを使って、任意の値を取得 /げんむ (20/03/19(Thu) 11:15) #34433
│  └Nomalアイコン Re[3]: WebBrowser Controlを使って、任意の値を取得 /魔界の仮面弁士 (20/03/19(Thu) 14:06) #34434
Nomalアイコン Re[1]: WebBrowser Controlを使って、任意の値を取得 /魔界の仮面弁士 (20/03/19(Thu) 09:48) #34432
  └Nomalアイコン Re[2]: WebBrowser Controlを使って、任意の値を取得 /げんむ (20/03/19(Thu) 16:06) #34435 解決み!


親記事 / ▼[ 34431 ] ▼[ 34432 ]
■34430 / 親階層)  WebBrowser Controlを使って、任意の値を取得
□投稿者/ げんむ 一般人(1回)-(2020/03/18(Wed) 21:43:36)
  • アイコン環境/言語:[c# vs2019 .net 4.52] 
    分類:[.NET] 

    <td>内容1</td>
    <td style="font-weight:bold;" nowrap><aa href="/abc.html"><img src="/y.png">内容2</aa></td>
    <td>内容3</td>
    <td style="font-weight:bold;" nowrap><aa href="/def.html"><img src="/y.png">内容4</aa></td>
    <td><aa href="/def.html">内容5</aa></td>
    
    
    このようなHTMLがあります。TDタグのstyle属性にfont-weight:bold;が指定されているlink先と要素を取得したいです。
    上のHTMLでは、/abc.htmlと内容2、/def.htmlと内容4という値を取得したいです。
    
    そこでWebBrowser Controlを使いわかるところまで書きました。
    
     HtmlElementCollection elems = webBrowser1.Document.GetElementsByTagName("td");
    foreach (HtmlElement elem in elems)
    {
    	Debug.WriteLine(elem.InnerText);
    	//Debug.WriteLine(elem.GetAttribute("style"));
    }
    
    わからない点は以下になります。
    問題1.
    elem.InnerTextは全てのTDタグの要素を取得してしまうので、どのようにstyleがfont-weight:bold;のものだけを取得すればいいのかわからないです。
    var x = elem.GetAttribute("style")としましたが、なんの値も取得できませんでした。
    
    問題2.
    hrefのリンク先を取得する方法がまったくわかりません。
    
    よろしくお願い致します。
    
    Aタグはaのところをaaにしています

違反を報告
[ □ Tree ] 返信 削除キー/

▲[ 34430 ] / ▼[ 34433 ]
■34431 / 1階層)  Re[1]: WebBrowser Controlを使って、任意の値を取得
□投稿者/ Hongliang 大御所(573回)-(2020/03/18(Wed) 22:16:59)
  • アイコン> 問題1.
    > elem.InnerTextは全てのTDタグの要素を取得してしまうので、どのようにstyleがfont-weight:bold;のものだけを取得すればいいのかわからないです。
    HtmlElementにはStyleプロパティが用意されています。

    > 問題2.
    > hrefのリンク先を取得する方法がまったくわかりません。
    とりあえず、アドレス自体はa要素を指すHtmlElementに対してGetAttribute("href")を行うことで取得できます。
    リンク先を取得というのは、abc.htmlやdef.htmlの中身をファイルや文字列として取得したいということでしょうか?
    cookieとかが要求されないのであれば、HttpClientクラスのGetStringAsyncとかを使えばいいですが。
違反を報告
[ 親 34430 / □ Tree ] 返信 削除キー/

▲[ 34431 ] / ▼[ 34434 ]
■34433 / 2階層)  Re[2]: WebBrowser Controlを使って、任意の値を取得
□投稿者/ げんむ 一般人(3回)-(2020/03/19(Thu) 11:15:47)
  • アイコン
    > HtmlElementにはStyleプロパティが用意されています。
    ->styleプロパティで取得できました。
     
    >アドレス自体はa要素を指すHtmlElementに対してGetAttribute("href")を行うことで取得できます。
    ->リンク先を文字列で取得したかったのげ、GetAttributeで大丈夫でした。
    
    以下のコードで目的を達成はできました。
    
                HtmlElementCollection elems = webBrowser1.Document.GetElementsByTagName("td");
    
                foreach (HtmlElement elem in elems)
                {
                    string style = elem.Style;
    
                    if (!(string.IsNullOrEmpty(style)) && style.Contains("font-weight: bold;"))
                    {
                        HtmlElementCollection a = elem.GetElementsByTagName("A");
                        string href = a[0].GetAttribute("href");
                        Debug.WriteLine(style);
                        Debug.WriteLine(href);
                    }
                }
    
    ただ、
    HtmlElementCollection a = elem.GetElementsByTagName("A");
    string href = a[0].GetAttribute("href");
    の箇所が何か変な気がします。もっと上手な書き方はあるでしょうか?

違反を報告
[ 親 34430 / □ Tree ] 返信 削除キー/

▲[ 34433 ] / 返信無し
■34434 / 3階層)  Re[3]: WebBrowser Controlを使って、任意の値を取得
□投稿者/ 魔界の仮面弁士 大御所(1276回)-(2020/03/19(Thu) 14:06:03)
  • アイコンNo34433に返信(げんむさんの記事)
    > HtmlElementCollection a = elem.GetElementsByTagName("A");
    > string href = a[0].GetAttribute("href");
    > の箇所が何か変な気がします。

    どの点が気にかかりますか?

    もしも [0] でのアクセスが気になるという話なら、
    事前に『 if (a.length > 0)』の判定を付け加えてください。


    また、Microsoft HTML Object Library の併用でも良ければ、
    こういう書き方にもできます。

    var doc = (mshtml.HTMLDocument)webBrowser1.Document.DomDocument;
    foreach (mshtml.HTMLTableCell cell in doc.getElementsByTagName("TD"))
    {
      // if (cell.style.fontWeight == "bold")
      if ((cell.style.cssText ?? "").Contains("font-weight: bold;") )
      {
        var anchors = cell.getElementsByTagName("A");
        if (anchors.length > 0)
        {
          mshtml.HTMLAnchorElement a = anchors.item(0);
          Debug.WriteLine(a.href);
        }
      }
    }


    WebBrowser への表示が不要なら、HTMLAgencyPack と言う手も。

    https://html-agility-pack.net/
    https://www.nuget.org/packages/HtmlAgilityPack/
    https://www.atmarkit.co.jp/ait/articles/1501/27/news140.html
違反を報告
[ 親 34430 / □ Tree ] 返信 削除キー/

▲[ 34430 ] / ▼[ 34435 ]
■34432 / 1階層)  Re[1]: WebBrowser Controlを使って、任意の値を取得
□投稿者/ 魔界の仮面弁士 大御所(1275回)-(2020/03/19(Thu) 09:48:39)
  • アイコン
    No34430に返信(げんむさんの記事)
    > そこでWebBrowser Controlを使いわかるところまで書きました。
    
    既定の IE7 モードのままでの利用でしょうか。
    それとも FEATURE_BROWSER_EMULATION を変更されているのでしょうか。
    
    
    > どのようにstyleがfont-weight:bold;のものだけを取得すればいいのかわからないです。
    
    td に対して font-weight が指定されていなかったとしても
    tr や table に対して font-weight:bold が割り当てられていた場合、
    セルのテキストは bold になる可能性があります。
    .css ファイルでスタイルが設定される場合もありますし。
    
    
    カスケーディングも考慮する必要がある場合には、
    getComputedStyle メソッドもしくは
    currentStyle プロパティを使用できます。
    
    
    dynamic w = webBrowser1.Document.Window.DomWindow;
    string[] values = { "bold", "700" };
    
    var q = from td in webBrowser1.Document.GetElementsByTagName("TD").OfType<HtmlElement>()
            /* let fontWeight = (string)((dynamic)td.DomElement).currentStyle.fontWeight */
            let fontWeight = (string)w.getComputedStyle(td.DomElement).fontWeight
            where values.Contains(fontWeight)
            let anchor = td.FirstChild
            where anchor != null && anchor.TagName == "A"
            select new
            {
                Link = anchor.GetAttribute("href"),
                Text = anchor.InnerText
            };
    
    var sb = new StringBuilder();
    foreach (var anchor in q)
    {
        sb.AppendLine(anchor.Link).AppendLine(anchor.Text).AppendLine();
    }
    MessageBox.Show(sb.ToString());

違反を報告
[ 親 34430 / □ Tree ] 返信 削除キー/

▲[ 34432 ] / 返信無し
■34435 / 2階層)  Re[2]: WebBrowser Controlを使って、任意の値を取得
□投稿者/ げんむ 一般人(4回)-(2020/03/19(Thu) 16:06:50)
  • アイコンありがとうございました。無事に解決しました!
解決み!
違反を報告
[ 親 34430 / □ Tree ] 返信 削除キー/


Mode/  Pass/


- Child Tree -