2017-02-14 1 views
1

Ich kann bestimmte Zeile mit HtmlProvider finden.F # HtmlProvider zu HtmlNode

Ist es möglich, eine andere HTML-Information von HtmlProvider.Tables.Row zu bekommen?

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 

Jetzt habe ich wantedRow und something3 String extrahieren kann.

Aber ich muss class dieser Reihe (orange) bekommen.

So etwas wie dies in Pseudo-Code geschrieben (GetHtml pseudo ..):

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

Ist es möglich, solche Informationen mit Leichtigkeit von HtmlProvider zu bekommen?

+1

Randbemerkung: Sie können '" "" 'als String-Trennzeichen verwenden und Sie müssen nichts im Inneren entkommen. – Tarmil

+0

@Tarmil Großartig! – Alamakanambra

Antwort

3

Die Tables Funktionalität der HtmlProvider behandelt die Tabelle als Daten und verwerfen HTML-Attribute. Um an der HTML zu bekommen selbst, können Sie es wie ein HTML-Dokument zur Behandlung zurückgreifen:

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" 

(natürlich in einer realen Welt Beispiel finden Sie einige Sicherheitsvorkehrungen für den Fall Knoten wollen nicht existieren oder die Floats nicht analysieren, aber das sollte Sie in die richtige Richtung gehen)