2017-02-14 6 views
1

HtmlProviderで特定の行を見つけることができます。F#HtmlProvider to HtmlNode

HtmlProvider.Tables.Rowから別のhtml情報を取得することはできますか?

type Provider = HtmlProvider<" 
<table><tbody> 
<tr><td class=\"orange\" >something2</td><td>20.1</td></tr> 
<tr><td class=\"grean\" >something</td><td>23.5</td></tr> 
<tr><td class=\"orange\" >something3</td><td>20.0</td></tr> 
</tbody></table>">// backslashes are for escaping 

let wantedRow = Provider.GetSample().Tables.Table1.Rows 
       |> Seq.filter (fun c->if float (c.Column2)=20.0 then true else false) 
       |> Seq.head 

は、今私はwantedRowを持っているとsomething3文字列を抽出することができます。

しかし、私はその行のclassorange)を取得する必要があります。 擬似コードで書かれたこのような

何か(GetHtmlが擬似..です):

(*Pseudo code warning *) 
let tdTag= wantedRow.GetHtml.Descendants["td"] |>Seq.head 
let classStr = tdOfWantedRow.AttributeValue ("class") //orange 

HtmlProviderの容易さと、そのような情報を入手することが可能ですか?

+1

サイドノート:文字列区切り文字として '' "' 'を使用することができ、何かをエスケープする必要はありません – Tarmil

+0

@タミル偉大な! – Alamakanambra

答えて

3

HtmlProviderTables機能は、表をデータとして扱い、html属性を破棄します。

let wantedRow = Provider.GetSample().Html.Descendants("tr") 
       |> Seq.filter (fun x -> float((x.Descendants("td") |> Seq.item 1).InnerText()) = float(20.0)) 
       |> Seq.head 

let cssClass = (wantedRow.Descendants() |> Seq.head).Attribute("class").Value() 

printf "%s\n" cssClass 
// prints "orange" 

(もちろん、現実世界の例では、あなたが存在しない場合のノードでいくつかのセーフガードをお勧めします:HTML自体で取得するには、HTMLドキュメントのようにそれを治療に頼ることができます浮動小数点数は解析されませんが、これは正しい方向に向かうでしょう)