首页 > 解决方案 > F#Data HTML 类型提供程序缺少表类型

问题描述

文档位于

http://fsharp.github.io/FSharp.Data/library/HtmlProvider.html

声明以下内容;

“生成的类型提供了一个表的类型空间,它已设法从给定的 HTML 文档中解析出来。每种类型的名称都派生自提供的 id、标题、名称、摘要或标题属性/标签。如果这些实体都没有如果所有表都被展平成一个列表,则该表将简单地命名为 Tablexx,其中 xx 是 HTML 文档中的位置。"

我正在尝试解析以下 url optionsdata = = HtmlProvider<" http://finance.yahoo.com/q/op?s=DDD+Options ">

我没有看到任何 Tablexx... 类型。任何帮助表示赞赏,并在此先感谢。当我查看源代码时,有 /table 标签,并且 html 页面上肯定有表格。

标签: f#f#-dataf#-3.0

解决方案


GET当您从脚本发出普通请求时,雅虎似乎不会向您发送与您在网络浏览器中看到的内容相同的页面。这就是类型提供者看不到表格的原因——它们实际上在到达类型提供者的 HTML 中丢失了。您可以通过查看Html类型提供程序在使用它加载页面时获得的 来看到这一点:

type DDD = HtmlProvider<"http://finance.yahoo.com/q/op?s=DDD+Options">
DDD.GetSample().Html |> printfn "%A"

作为修复,您可以在浏览器中查看源代码,将其保存在本地文件中,然后将其传递给类型提供程序。使用它,我能够编写以下代码:

type DDD = HtmlProvider<"c:/temp/yahoo.html">
let ddd = DDD.GetSample()

for r in ddd.Tables.Table1.Rows do
  printfn "%s" r.``Contract Name``

GetSample方法只是从文件系统加载文件。我假设您想要解析实时网页 - 为此,您需要弄清楚如何从 Yahoo 获取正确的 HTML(大概是通过设置一些 HTTP 标头和 cookie)。然后你可以调用DDD.Parse(html)来加载你的实际数据。


推荐阅读