<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にしています
■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());
> 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"); の箇所が何か変な気がします。もっと上手な書き方はあるでしょうか?