Можно ли считать таблицы в поставщике типов HTML? - PullRequest
0 голосов
/ 29 октября 2018

У меня есть страница Wiki, и по определенным причинам меня интересует подсчет таблиц там.

По-видимому, глубоко в подпорках Lists и Tables представлены в виде последовательностей: enter image description here

Есть ли способ получить эти цифры в коде?

Я пробовал несколько ужасных хаков:

open System
open FSharp.Data
open FSharp.Data.Runtime

type Wiki = HtmlProvider<"https://en.wikipedia.org/wiki/F_Sharp_(programming_language)">

let getTablesCount (url : string) =
    let data = Wiki.Load url
    let tables = data.Tables

    // won't compile - type constraint mismatch
    // let attempt1 = tables :> Map<string, HtmlTable> |> Map.count

    // won't compile - type is not compatible
    // let attempt2 = tables |> Seq.cast<Tuple<string, HtmlTable>> |> Seq.length

    // compiles - throws in the runtime InvalidCastException
    // let attempt3 = (box tables) :?> Map<string, HtmlTable> |> Map.count

    42

Ничего не работает, вероятно, навсегда.Может быть, я упускаю что-то очевидное?

Я готов проанализировать html с регулярным выражением , например, использовать для этого FSharp.Data HTML Parser, просто хочу быть уверен.

1 Ответ

0 голосов
/ 29 октября 2018

Я не очень знаком с HtmlProvider, я думаю, вы могли бы использовать отражение и, возможно, получить непубличные типы, что довольно забавно, или использовать HtmlAgilityPack .

В HtmlProvider поиск узлов "таблицы" дает мне счет 10:

enter image description here

open FSharp.Data

type Wiki = HtmlProvider<"https://en.wikipedia.org/wiki/F_Sharp_(programming_language)">

[<EntryPoint>]
let main argv = 

    let getTablesCount (url : string) =
        let data = Wiki.Load url
        let tables = data.Tables
        let props = tables.Html.Descendants("table") 
        props |> Seq.length |> (printfn "%A %A" "Table count is:")


    getTablesCount("https://en.wikipedia.org/wiki/F_Sharp_(programming_language)")    
    0

enter image description here

...