我们也可以提供一个本地文件:type wikipedia = HtmlProvider<"list_of_ral_colors.html">如果您并不总是希望击中远程站点,则本地文件非常出色。但是,您遇到了在本地的旧版本的风险,而不是在服务器上导致丑陋的问题。据我们所关注的剧本。我将在维基百科指出它,并务必在年底捐款在JSON文件中,我们将想要存储RAL,RGB和Color Name。所以,让我们快速创建一个记录类型:type ralColor = { ral: string; hex: string; name: string}现在我们有我们的类型,我们都设置为提取该数据。通过查看网站,我们可以看到该表所在的部分:了解这个位置,我们可以扫描网站并磨合我们正在寻找的数据:let ralColorSection = wikipedia.Load("//en.wikipedia.org/wiki/List_of_RAL_colors") .Tables .``All RAL Colours in a single listing``If you have never used type providers, you will be probably reading the lines above and go: “Okay… I guess…†- so let’s just quickly look at what happened underneath those lines of code. As the name suggests, type providers provide a type based on a data source. This is where we nod. So what do we get with the lines above? We get a type which represents the table of RAL colours. We can access all of the rows via ralColorSection.Rows. When iterating over each row we can read the value in a column by using its name. So we could print out all colour names as follows:ralColorSection.Rows |> Seq.iter (fun r -> printfn "%s" r.``Colour name``)我知道这是令人寒冷的吧!因此,如果我们从表中提取RAL,RGB和名称,我们可以使用先前定义的类型和如下的值:let ralColors = ralColorSection.Rows |> Seq.map((fun r -> {ral = r.``RAL Number``; hex = r.``HEX Triplet``; name = r.``Colour name``}))注意这两个刻度是可以访问它们中空格的F#变量。现在我们拥有我们想要的所有数据。所以现在剩下的所有这些都是将它存储到JSON文件中的无聊位:#I "./packages"#r "Newtonsoft.Json/lib/netstandard2.0/Newtonsoft.Json.dll"// ...open Newtonsoft.Json// ...let writeToJsonFile ralColors = let filePath = Path.Combine(__SOURCE_DIRECTORY__, "ral_colour_map.json") let jsonString = JsonConvert.SerializeObject(ralColors) File.WriteAllText(filePath, jsonString, Encoding.UTF8) |> ignore这包装了这个博文。我希望你已经看到F#--S类型提供商可以是扫描数据源的好方法,并提取所需的信息。有一件事要注意使用类型提供者:您可以直接与其他.NET语言分享生成的类型,如C#。您必须在记录类型中包装数据 - 顺便:按所创建的类型以保持数据子集是记录类型。因此,虽然在编写完全成熟的企业应用程序时可能会有一些额外的努力,但它们是一个没有脚本的脑子。在探索新数据集时,将为您提供显着的生产力提升。一定要查看官方documentation在此帖子中使用的HTML提供程序。一如既往,您可以找到整个代码GitHub.HTH">

用F#从网站提取数据

包含颜色蜡笔的图片

我最近面临着渲染的任务ral颜色在我正在开发的应用程序上。 RAL颜色主要用于工业彩色器具 - 即粉末涂料。因此,虽然在粉末涂料行业中众所周知,但在维基百科读取了一个令人兴奋的阅读,以了解RAL颜色如何成为生活。好事是有一个有限的经典兰。更好的是有一张桌子维基百科其中包含经典RAL颜色的足够好的近似。

所以而不是复制&将表粘贴到编辑器中并削减数据。我想知道是否有更好的方法可以从网站上提取信息。并以更方便的形式存储数据,例如JSON文件。

在过去的几个月里,我在空闲时间与F#达到了曲折。数据提供程序是一个功能强大的工具,可在F#语言中使用。简而言之,您可以在数据源中指向数据提供程序,在编译期间,该源中使用的类型为您生成。因此,从网站上获得典型的JSON响应。您可以使用JSON类型提供程序根据该流创建一种类型,然后可以在整个F#程序中使用。现在,这是来自JSON Visual Studio功能的C#Poco的一个。您还通过数据获取切片和骰子的方法。换句话说,它是用于探索新数据源或仅解析新数据源和处理数据的绝佳工具。

与LINQ扩展一样,可以编写您的类型提供程序。但对于大多数常规用例,类型提供商已经存在,并且可以作为核保存包添加到您的项目中。这尼古特 package we will be using is the FSharp.Data which provides type providers for JSON, XML, CSV and HTML (plus the World Bank â€ğŸ¤·â€â™‚ï¸).

使用F#脚本,我们将首先要引用类型提供程序:

#I "./packages"
#r "FSharp.Data/lib/netstandard2.0/FSharp.Data.dll"

open FSharp.Data

侧面注意:我正在使用Paket. for my dependency management because it installs the package right into the project folder. You do not need to use paket, but you will have to make sure that the #r ... line points to the dll.

现在类型提供程序基于数据源创建类型。在我们的案例中,我可以在Wikipedia网站上列出所有RAL颜色:

type wikipedia = HtmlProvider<"//en.wikipedia.org/wiki/List_of_RAL_colors">

我们也可以提供一个本地文件:

type wikipedia = HtmlProvider<"list_of_ral_colors.html">

如果您并不总是希望击中远程站点,则本地文件非常出色。但是,您遇到了在本地的旧版本的风险,而不是在服务器上导致丑陋的问题。据我们所关注的剧本。我将在维基百科指出它,并务必在年底捐款

在JSON文件中,我们将想要存储RAL,RGB和Color Name。所以,让我们快速创建一个记录类型:

type ralColor = { ral: string; hex: string; name: string}

现在我们有我们的类型,我们都设置为提取该数据。通过查看网站,我们可以看到该表所在的部分:

显示wikipedia Ralcolor列表的一部分的图片

了解这个位置,我们可以扫描网站并磨合我们正在寻找的数据:

let ralColorSection = wikipedia.Load("//en.wikipedia.org/wiki/List_of_RAL_colors")
                                .Tables
                                .``All RAL Colours in a single listing``

If you have never used type providers, you will be probably reading the lines above and go: “Okay… I guess…†- so let’s just quickly look at what happened underneath those lines of code. As the name suggests, type providers provide a type based on a data source. This is where we nod. So what do we get with the lines above? We get a type which represents the table of RAL colours. We can access all of the rows via ralColorSection.Rows. When iterating over each row we can read the value in a column by using its name. So we could print out all colour names as follows:

ralColorSection.Rows |> Seq.iter (fun r -> printfn "%s" r.``Colour name``)

我知道这是令人寒冷的吧!因此,如果我们从表中提取RAL,RGB和名称,我们可以使用先前定义的类型和如下的值:

let ralColors = ralColorSection.Rows
                    |> Seq.map((fun r -> 
                        {ral = r.``RAL Number``; 
                            hex = r.``HEX Triplet``; 
                            name = r.``Colour name``}))

注意这两个刻度是可以访问它们中空格的F#变量。现在我们拥有我们想要的所有数据。所以现在剩下的所有这些都是将它存储到JSON文件中的无聊位:

#I "./packages"
#r "Newtonsoft.Json/lib/netstandard2.0/Newtonsoft.Json.dll"

// ...

open Newtonsoft.Json

// ...

let writeToJsonFile ralColors =
    let filePath = Path.Combine(__SOURCE_DIRECTORY__, "ral_colour_map.json")
    let jsonString = JsonConvert.SerializeObject(ralColors)
    File.WriteAllText(filePath, jsonString, Encoding.UTF8) |> ignore

这包装了这个博文。我希望你已经看到F#--S类型提供商可以是扫描数据源的好方法,并提取所需的信息。有一件事要注意使用类型提供者:您可以直接与其他.NET语言分享生成的类型,如C#。您必须在记录类型中包装数据 - 顺便:按所创建的类型以保持数据子集是记录类型。因此,虽然在编写完全成熟的企业应用程序时可能会有一些额外的努力,但它们是一个没有脚本的脑子。在探索新数据集时,将为您提供显着的生产力提升。

一定要查看官方文件在此帖子中使用的HTML提供程序。一如既往,您可以找到整个代码GitHub..

Hth.

更新: