类型提供程序“ ProviderImplementation.HtmlProvider”报告错误:Cookie的“ Value” =“ XXXX”部分无效

时间:2019-05-23 02:31:49

标签: f# fsharp.data.typeproviders

我正在使用HtmlProvider网上抓取股票公司的新闻,例如https://www.nasdaq.com/symbol/{STOCK_SYMBOL_HERE}/news-headlines,但在此行代码中出现错误

let [<Literal>] stockNewsUrl = "https://www.nasdaq.com/symbol/AAPL/news-headlines"
let news = new HtmlProvider<stockNewsUrl>()

第二行有花样,错误为Error FS3033 The type provider 'ProviderImplementation.HtmlProvider' reported an error: Cannot read sample HTML from 'https://www.nasdaq.com/symbol/AAPL/news-headlines': The 'Value'='AAPL,technology' part of the cookie is invalid.

2 个答案:

答案 0 :(得分:2)

这似乎失败了,因为F#Data以Nasdaq服务不喜欢的格式发送cookie。一个简单的解决方法是将页面下载一次,以便在编译时获得示例,然后使用其他方法在运行时下载页面。

INSERT ... RETURNING

这可行,但是有两个问题:

  • 该页面不包含任何表/列表,因此type Nasdaq = HtmlProvider<"c:/temp/nasdaq.html"> let wc = new WebClient() let downloaded = wc.DownloadString("https://www.nasdaq.com/symbol/AAPL/news-headlines") let ns = Nasdaq.Load(downloaded) 的值不能很好地静态访问任何有用的内容
  • 当我尝试使用ns下载数据时,出现超时异常,因此也许也行不通(但可能只是我在代理之类的东西上。)

答案 1 :(得分:1)

要向https://www.nasdaq.com/symbol/AAPL/news-headlines发出HTTP请求,我们需要提供CookieContainer。由于您使用的是FSharp.Data库,因此我建议使用其HTTP Utilities

type Nasdaq = HtmlProvider<"/tmp.html">
let cc = CookieContainer ()
let data =
    Http.RequestString ("https://www.nasdaq.com/symbol/AAPL/news-headlines", cookieContainer = cc)
    |> Nasdaq.Parse
data.Tables.``Today's Market Activity``.Html
|> printfn "%A"

当然,您必须预先下载页面并首先保存到/tmp.html

小小的注意:如果我们已经有了HTML字符串(如本例所示),则使用Nasdaq.Parse;如果有网址,则使用Nasdaq.Load